Я построил C# WPF приложение, которое имеет несколько фоновых потоков, которые делают следующие задачи:C# WPF приложения замораживают в течение долгого времени
- несколько потоков, где каждый содержит сервер TCP, работающие в цикле в то время как и каждый из их просто ждем сообщений от конкретного порта
- Один потока постоянно отслеживает порт 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);
}
}
Таким образом, проблема я столкнулся в том, что иногда приложение просто зависает, и я не могу получить доступ к нему вообще. Основной поток пользовательского интерфейса также зависает, и я не могу убить программу даже из диспетчера задач в Windows. Обычно приложение работает отлично, но проблема будет возникать случайным образом после использования приложения в течение долгих часов (например, в течение 4-5 часов).
Компьютер, который я использую, - это не ПК высокого класса с 2G RAM и AMD двухъядерный процессор.
Моя догадка проблемы может быть следующее:
- Недостаточно памяти (или утечка памяти где-то, но окна работают нормально, и только программа замирает)
- сеть варенья (т.е. тупиковых где-то, но это не похоже, с простой отправки и получения приложения)
- не удалось установленное соединение с USB-устройств (в том числе) Kinect
Однако, я не являюсь до сих пор нет я уверен, как определить проблему. Я мог бы быть совершенно новым для реализации, поэтому мне бы хотелось услышать комментарии некоторых экспертов в C# WPF, сетевых и многопоточных приложениях, чтобы помочь мне здесь. Благодарю.
если вы в состоянии использовать .net 4 или 4.5, я бы предложил изучить параллельность задач: http://msdn.microsoft.com/en-us/library/dd537609 .aspx Он предоставляет опцию для длинных потоков запуска –
while loop? Что в то время как цикл? на разных портах?Обычно серверы не разработаны таким образом, как правило, на одном порту есть только один поток прослушивания, а затем один клиентский <> серверный поток для каждого соединения. –
Если ваше приложение умирает через 4-5 часов, попробуйте проверить, сколько гнезд застряло в TIME_WAIT с netstat. –