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

时间:2013-03-22 00:17:03

标签: c# wpf multithreading tcp kinect

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

  1. 几个线程,其中每个线程都包含一个在while循环中运行的TCP服务器,每个线程都在等待来自特定端口的消息
  2. 一个线程一直在监视I / O设备的USB端口
  3. 一个主题是从Microsoft Kinect设备获取数据
  4. 某个计时器调度程序线程根据从其他线程引发的“flags”(或静态全局变量)进行一些更新。
  5. 一个例子:

        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线程也冻结了,我甚至无法从Windows中的任务管理器中杀死程序。通常应用程序运行完全正常,但长时间使用该应用程序后问题会随机出现(例如4~5小时)

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

    我对问题的猜测如下:

    1. 内存不足(或某处内存泄漏,但Windows工作正常,只有程序冻结)
    2. 网络阻塞(即某处死锁,但这似乎不太可能是简单的发送和接收应用程序)
    3. 无法与USB设备建立连接(包括kinect)
    4. 但是,我仍然不确定如何找出问题所在。我可能仍然对实现很陌生,所以我很想听听C#WPF,网络和多线程应用程序的一些专家的意见,以帮助我在这里。感谢。

2 个答案:

答案 0 :(得分:0)

调试此方法的最简单方法是附加调试器(Visual Studio可以执行此操作)。然后看一下线程在做什么。要使用VS进行调试,请转到Debug - &gt;附加到处理并选择您的流程。如果这不起作用,您可以尝试使用任务管理器转储进程(如果您使用的是Windows 7或更高版本),只需右键单击该进程并选择Create Dump file。然后,您可以使用windbg或VS对文件进行离线分析。你想要看的最有用的是它被锁定时线程正在做什么。对于此类问题,这些通常是最好的第一步。

答案 1 :(得分:0)

在Visual Studio中是concurrency visualizer

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

您也可以考虑使用redgate的Performance Profiler等工具