WPF C# 应用程序运行 2-3 次就会冻结我的整个计算机

2024-03-16

我在这个问题上放了很多信息,因为我不知道什么是相关的

Issue:
我遇到一个问题,我正在开发的程序在运行时会冻结我的整个计算机并且不返回任何错误(我完全无法执行任何 CTRL+ALT+DEL 甚至不起作用的操作)。该程序接受来自 Android 客户端的连接,并且 Android 客户端配置不正确,因此连接被拒绝。

问题:
如何阻止我的程序冻结整个机器?

推测:
我对正在发生的事情有一些理论,但不知道如何解决它们。我读到这可能与我在异步工作线程中运行单线程进程有关,但我不确定套接字是单线程进程。另外,我也不完全确定应该如何处理后台工作程序中的异常,因此我只是让它回退到 RunWorkerCompletedEventArgs,然后从那里检索错误消息。

我尝试过的:
- 我尝试将 try catches 放在每个地方,然后删除 try catches 似乎没有任何东西能够捕获此错误
- 我检查了系统事件日志,除了计算机死机后重新启动之外,没有显示任何内容
- 我试图隔离该问题,但从程序启动到我尝试连接的任何时候,它实际上都可能发生

Setup:
我正在 Windows 8 Pro 机器上从 Visual Studio 2012 Professional 运行该程序。我使用的计算机配备 i7-3770K 3.50GHz 和 32GB 内存。尝试连接到我的应用程序是 Android 应用程序,尝试连接时凭据不正确。 Visual Studio 正在我的主硬盘驱动器上运行,并在另一个驱动器上构建项目。

Closing:
说了这么多,有人愿意帮助我吗?如果您需要更多信息,我很乐意提供,请询问。

主要方法:

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Data;
 using System.Windows.Documents;
 using System.Windows.Input;
 using System.Windows.Media;
 using System.Windows.Media.Imaging;
 using System.Windows.Navigation;
 using System.Windows.Shapes;
 using System.ComponentModel;

namespace Server
{
/// <summary>
/// Interaction logic for MainWindow.xaml
/// </summary>
public partial class SourceServer : Window
{
    private BackgroundWorker worker = new BackgroundWorker();

    public SourceServer()
    {
        InitializeComponent();

        StartListeningForConnections();
    }

    private void StartListeningForConnections()
    {

        worker.DoWork += new DoWorkEventHandler(worker_DoWork);
        worker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(worker_RunWorkerCompleted);
        worker.ProgressChanged += new ProgressChangedEventHandler(worker_ProgressChanged);
        worker.WorkerReportsProgress = true;

        if (worker.IsBusy != true)
        {
            worker.RunWorkerAsync();
        }
    }

    private void worker_DoWork(object sender, DoWorkEventArgs e)
    {
        worker.ReportProgress(0, "Source server version 0.0.0.1ib started");
        LoginServer oLoginServer = new LoginServer();
        oLoginServer.StartListening(worker);

    }

    private void worker_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        try
        {
            lvOutput.Items.Add(e.UserState.ToString());
        }
        catch (Exception exception)
        {
            lvOutput.Items.Add(exception.StackTrace);
        }
    }

    private void worker_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        if (e.Error != null)
        {
            System.IO.File.WriteAllText(Environment.CurrentDirectory + @"\log.txt", e.Error.StackTrace + " /n " + e.Error.Message);
        }
        else
        {
            MessageBox.Show("Error was null");
        }
        worker.Dispose();
    }
}
}

SSL 套接字连接:

 using System;
 using System.Collections.Generic;
 using System.Linq;
 using System.Text;
 using System.Threading.Tasks;
 using System.Threading;
 using System.Net;
 using System.Net.Sockets;
 using System.Windows;
 using System.Windows.Controls;
 using System.ComponentModel;
 using System.Net.Security;
 using System.Security.Cryptography.X509Certificates;
 using MySql.Data.MySqlClient;
 using System.IO;

namespace Server
{
public class LoginServer
{
    // Incoming data from the client.
    public static string data = null;
    public static X509Certificate serverCertificate = null;

    public delegate void UpdateListView(ListView oOutput);

    public void StartListening(BackgroundWorker worker)
    {
        // Data buffer for incoming data.
        byte[] bytes = new Byte[1024];

        // Establish the local endpoint for the socket.
        IPHostEntry ipHostInfo = Dns.GetHostEntry(Dns.GetHostName());
        IPAddress ipAddress = ipHostInfo.AddressList[1];

        serverCertificate = X509Certificate.CreateFromCertFile(@"server.crt");
        TcpListener oServer = new TcpListener(ipAddress, 12345);


        // Bind the socket to the local endpoint and 
        // listen for incoming connections.

        // Start listening for connections.
        while (true)
        {
            Thread.Sleep(100);
            worker.ReportProgress(0, "Waiting for connection....");

            // Program is suspended while waiting for an incoming connection.
            //Socket handler = listener.Accept();
            oServer.Start();
            TcpClient oClient = oServer.AcceptTcpClient();
            Stream oStream = oClient.GetStream();
            SslStream oSSLStream = new SslStream(oStream);

            data = null;

            // An incoming connection needs to be processed.
            string sUsername = "place holder";
            string sPassword = "place holder";

            while (true)
            {
                bytes = new byte[1024];
                int bytesRec = oSSLStream.Read(bytes, 0, bytes.Length);
                data += Encoding.ASCII.GetString(bytes, 0, bytesRec);

                string[] sCredentials = data.Split("|".ToCharArray()[0]);

                sUsername = sCredentials[0];
                sPassword = sCredentials[1];

                if (data.IndexOf("<EOF>") > -1)
                {
                    break;
                }
            }

            // Show the data on the console.
            worker.ReportProgress(0, "Connection Recieved : ");
            worker.ReportProgress(0, "Username: " + sUsername);
            worker.ReportProgress(0, "Password: " + sPassword);
            worker.ReportProgress(0, "");

            // Echo the data back to the client.
            byte[] msg;
            if (sUsername.Equals("test") && sPassword.Equals("test"))
            {
                msg = Encoding.ASCII.GetBytes("approved<EOF>\n");
                worker.ReportProgress(0, "approved");
                oSSLStream.Write(msg, 0, msg.Length);
            }
            else
            {
                msg = Encoding.ASCII.GetBytes("rejected<EOF>\n");
                worker.ReportProgress(0, "rejected");
                oSSLStream.Write(msg, 0, msg.Length);
            }
        }
    }

    public void VerifyUser()
    {

    }
}
}

虽然我没有看到任何原因会锁定您的整个计算机,但我确实看到了应用程序可能挂起的几个原因......

SSL 服务器内部的 while 循环永远不会中断,除非您的客户端写入


'<EOF>'  
to the stream; which you would have to force it to do. I would likely do something similar to this:
while(( bytesRec = oSSLStream.Read(bytes,0,bytes.Length)) > 0 )
{
    // Compare input & break
}

-- 您现在的 while 循环(没有线程睡眠)将消耗您所有的系统资源,等待......可能永远不会发生的事情。

在一个相关问题中 - 我注意到您的“DoWork”方法启动了侦听器 - 但没有为此侦听器启动新线程。这意味着侦听器在您的接口线程内部运行 - 这将导致接口(以及可能更多...)挂起,直到进程完成 - 正如所述,这可能永远不会发生。

...咳咳...最后一段可能不正确 - 您正在运行异步工作线程,所以我的第二次评估可能不正确。

干杯,希望这有帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

WPF C# 应用程序运行 2-3 次就会冻结我的整个计算机 的相关文章

  • 尚未注册类型“IServiceProviderFactory[Autofac.ContainerBuilder]”的服务

    当运行以下命令添加数据库迁移脚本时 出现以下错误 dotnet ef migrations add InitialCreate v o Migrations context MyContext 访问 Microsoft Extensions
  • 使用 Enumerable.OfType() 或 LINQ 查找特定类型的所有子控件

    Existed MyControl1 Controls OfType
  • 平滑滚动.net 表单

    您好 我正在 net 中使用表单 并且在运行时动态添加大量链接标签 我将这些链接标签添加到面板并将该面板添加到 winform 当链接标签的数量增加时 表单会显示一个自动滚动条 垂直 现在 当我使用自动滚动向下滚动时 表单在滚动时不会更新其
  • 我如何在 C# .NET(win7 手机)中使用“DataContractJsonSerializer”读入“嵌套”Json 文件?

    我有一个问题 如果我的 json 文件看起来像这样 Numbers 45387 Words 空间桶 我可以很好地阅读它 但是如果它看起来像这样 Main Numbers 45387 Words 空间桶 某事 数字 12345 单词 克兰斯基
  • 类特定的新删除运算符是否必须声明为静态

    标准中是否要求类特定的 new new delete 和 delete 是静态的 我可以让它们成为非静态成员运算符吗 为什么需要它们是静态的 它们被隐式声明为静态 即使您没有键入 static
  • 找不到 assimp-vc140-mt.dll ASSIMP

    我已经从以下位置下载了 Assimp 项目http assimp sourceforge net main downloads html http assimp sourceforge net main downloads html Ass
  • ASP.Net Core 内容配置附件/内联

    我正在从 WebAPI 控制器返回一个文件 Content Disposition 标头值自动设置为 附件 例如 处置 附件 文件名 30956 pdf 文件名 UTF 8 30956 pdf 当它设置为附件时 浏览器将要求保存文件而不是打
  • 时间:2019-03-17 标签:c#ThreadSafeDeepCopy

    我一直在阅读很多其他问题以及大量谷歌搜索 但我一直无法找到明确的解决方案 根据我读过的一些最佳实践 类的静态方法应该创建线程安全的 并且实例成员应该将线程安全留给消费者 我想为该类实现深度复制方法 该类本身还有其他引用类型成员 有没有什么方
  • 如何获取 QTableView 的标题列表?

    我有一个QTableView我的对话框中的对象 我需要访问该表的水平标题并将它们放入QStringList object 尽管进行了大量搜索 但我在 Qt 文档中找不到如何获取此标头列表 编辑 我发现的最接近的地方是this https w
  • C# 构建一个 webservice 方法,它接受 POST 方法,如 HttpWebRequest 方法

    我需要一个接受 POST 方法的 Web 服务 访问我的服务器正在使用 POST 方法 它向我发送了一个 xml 我应该用一些 xml 进行响应 另一方面 当我访问他时 我已经使用 HttpWebRequest 类进行了管理 并且工作正常
  • 将二进制数据从 C# 上传到 PHP

    我想将文件从 Windows C 应用程序上传到运行 PHP 的 Web 服务器 我知道 WebClient UploadFile 方法 但我希望能够分块上传文件 以便我可以监控进度并能够暂停 恢复 因此 我正在读取文件的一部分并使用 We
  • 如何通过 JsonConvert.DeserializeObject 在动态 JSON 中使用 null 条件运算符

    我正在使用 Newtonsoft 反序列化已知的 JSON 对象并从中检索一些值 如果存在 关键在于对象结构可能会不断变化 因此我使用动态来遍历结构并检索值 由于对象结构不断变化 我使用 null 条件运算符来遍历 JSON 代码看起来像这
  • 将标量添加到特征矩阵(向量)

    我刚刚开始使用 Eigen 库 无法理解如何向所有矩阵成员添加标量值 假设我有一个矩阵 Eigen Matrix3Xf mtx Eigen Matrix3Xf Ones 3 4 mtx mtx 1 main cxx 104 13 error
  • 我可以让 ungetc 取消阻止阻塞的 fgetc 调用吗?

    我想在收到 SIGUSR1 后使用 ungetc 将 A 字符重新填充到标准输入中 想象一下我有充分的理由这样做 调用 foo 时 stdin 中的阻塞读取不会被收到信号时的 ungetc 调用中断 虽然我没想到它会按原样工作 但我想知道是
  • IEnumerable.Except 不起作用,那么我该怎么办?

    我有一个 linq to sql 数据库 非常简单 我们有 3 个表 项目和用户 有一个名为 User Projects 的连接表将它们连接在一起 我已经有了一个获得的工作方法IEnumberable
  • cout 和字符串连接

    我刚刚复习了我的 C 我尝试这样做 include
  • 了解使用 Windows 本机 WPF 客户端进行 ADFS 登录

    我已经阅读了大量有关 ADFS 与 NodeJS Angular 或其他前端 Web 框架集成以及一般流程如何工作的文献 并通过 Auth0 Angular 起始代码构建了概念证明 但我不明白如何这可以与本机 WPF Windows 应用程
  • 每个数据库多个/单个 *.edmx 文件

    我有一个通过 ADO net 数据服务与数据库交互的项目 数据库很大 近 150 个具有依赖关系的表 该项目几年前开始 当时使用的是数据集 现在我们正在转向实体模型关系 由于我们添加了更多需要使用的表 该模型正在不断增长 这是管理这一切的正
  • 将 char[][] 转换为 char** 会导致段错误吗?

    好吧 我的 C 有点生疏了 但我想我应该用 C 来做我的下一个 小 项目 这样我就可以对其进行抛光 并且我已经有不到 20 行的段错误了 这是我的完整代码 define ROWS 4 define COLS 4 char main map
  • 使我的 COM 程序集调用异步

    我刚刚 赢得 了在当前工作中维护用 C 编码的遗留库的特权 这个dll 公开使用 Uniface 构建的大型遗留系统的方法 除了调用 COM 对象之外别无选择 充当此遗留系统与另一个系统的 API 之间的链接 在某些情况下 使用 WinFo

随机推荐