c# WPF应用程序冻结随着时间的推移

本文关键字:时间 WPF 应用程序 冻结 | 更新日期: 2023-09-27 18:05:26

我已经构建了一个c# WPF应用程序,它有几个后台线程,它们正在执行以下任务:

  1. 几个线程,每个线程都包含一个TCP服务器,运行在while循环中,每个线程都在等待来自特定端口的消息
  2. 一个线程持续监控一个I/O设备的USB端口
  3. 一个线程正在从微软Kinect设备获取数据
  4. 一些定时器调度线程正在做一些更新基于"标志"(或静态全局变量)从其他线程。

示例:

    Thread thread = new Thread(new ThreadStart(Server));
    private static void Server()
    {
        try
        {
            IPAddress ipAd = IPAddress.Parse("192.168.1.119");
            // use local m/c IP address, and 
            // use the same in the client
            /* Initializes the Listener */
            TcpListener myList = new TcpListener(ipAd, 8003);
            /* Start Listeneting at the specified port */
            myList.Start();
            System.Diagnostics.Debug.Write("The server is running at port 8003...");
            System.Diagnostics.Debug.Write("The local End point is  :" +
                              myList.LocalEndpoint);
            System.Diagnostics.Debug.Write("Waiting for a connection.....");
            Socket s = myList.AcceptSocket();
            System.Diagnostics.Debug.Write("Connection accepted from " + s.RemoteEndPoint);
            byte[] b = new byte[100];
            k = s.Receive(b);
            Console.WriteLine("Recieved...");
            string temp = "";
            for (int i = 0; i < k; i++)
            {
                System.Diagnostics.Debug.Write(Convert.ToChar(b[i]));
                temp += Convert.ToChar(b[i]);
            }
            ASCIIEncoding asen = new ASCIIEncoding();
            s.Send(asen.GetBytes("The string was recieved by the server."));
            System.Diagnostics.Debug.Write("'nSent Acknowledgement");
            /* clean up */
            s.Close();
            myList.Stop();
            if (k > 0)
            {
                cont = true;
                k = 0;
            }
        }
        catch (Exception e)
        {
            Console.WriteLine("Error..... " + e.StackTrace);
        }    
    }

所以我遇到的问题是,偶尔应用程序只是冻结,我不能访问它。主UI线程也冻结,我不能杀死程序,甚至从任务管理器在窗口。正常情况下,应用程序运行良好,但长时间使用应用程序(例如4~5小时)后,问题会随机出现

我使用的电脑不是只有2G内存和AMD双核CPU的高端PC。

我对这个问题的猜测如下:

  1. 内存不足(或内存泄漏,但窗口工作正常,只有程序冻结)
  2. 网络阻塞(即死锁,但这似乎不太可能与简单的发送和接收应用程序)
  3. 连接USB设备(包括kinect)失败
然而,我仍然不知道如何解决这个问题。我可能对实现还很陌生,所以我很乐意听到一些c# WPF、网络和多线程应用方面的专家的评论来帮助我。谢谢。

c# WPF应用程序冻结随着时间的推移

最简单的调试方法是附加一个调试器(Visual Studio可以这样做)。然后看看线程在做什么。要使用VS进行调试,请进入debug -> Attach To Process并选择您的进程。如果这不起作用,您可以尝试使用任务管理器转储进程(如果您有Windows 7或更高版本),只需右键单击该进程并选择创建转储文件。然后,您可以使用windbg或vs对文件进行脱机分析。您想要查看的最有用的信息是,当文件被锁定时,线程正在做什么。对于这类问题,这通常是最好的第一步。

Visual Studio是一个并发可视化器

我会使用它(我认为它从VS 2010开始可用)。这也可以附加到外部进程(如Visual Studio Debugger也可以)。

你也可以考虑使用工具,比如来自redgate的Performance Profiler