我已经构建了一个 C# WPF 应用程序,它有几个后台线程,它们正在执行以下任务:
- 几个线程,每个线程都包含一个在 while 循环中运行的 TCP 服务器,每个线程都在等待来自特定端口的消息
- 一个线程持续监控 I/O 设备的 USB 端口
- 一个线程正在从 Microsoft Kinect 设备获取数据
- 一些定时器调度线程基于从其他线程引发的“标志”(或静态全局变量)进行一些更新。
一个例子:
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 的高端 PC。
我对问题的猜测如下:
- 内存不足(或某处内存泄漏,但 Windows 工作正常,只有程序冻结)
- 网络堵塞(即某处死锁,但这似乎不太可能与简单的发送和接收应用程序)
- 与 USB 设备(包括 kinect)建立连接失败
但是,我仍然不确定如何找出问题所在。我可能对实现还很陌生,所以我很想听听一些 C# WPF、网络和多线程应用程序方面的专家的评论,以帮助我。谢谢。