2013-03-22 2 views
3

Я построил C# WPF приложение, которое имеет несколько фоновых потоков, которые делают следующие задачи:C# WPF приложения замораживают в течение долгого времени

  1. несколько потоков, где каждый содержит сервер TCP, работающие в цикле в то время как и каждый из их просто ждем сообщений от конкретного порта
  2. Один потока постоянно отслеживает порт USB для устройства ввода/вывода
  3. Один потока приобретающих данных из устройства Microsoft 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); 
     }  
    } 

Таким образом, проблема я столкнулся в том, что иногда приложение просто зависает, и я не могу получить доступ к нему вообще. Основной поток пользовательского интерфейса также зависает, и я не могу убить программу даже из диспетчера задач в Windows. Обычно приложение работает отлично, но проблема будет возникать случайным образом после использования приложения в течение долгих часов (например, в течение 4-5 часов).

Компьютер, который я использую, - это не ПК высокого класса с 2G RAM и AMD двухъядерный процессор.

Моя догадка проблемы может быть следующее:

  1. Недостаточно памяти (или утечка памяти где-то, но окна работают нормально, и только программа замирает)
  2. сеть варенья (т.е. тупиковых где-то, но это не похоже, с простой отправки и получения приложения)
  3. не удалось установленное соединение с USB-устройств (в том числе) Kinect

Однако, я не являюсь до сих пор нет я уверен, как определить проблему. Я мог бы быть совершенно новым для реализации, поэтому мне бы хотелось услышать комментарии некоторых экспертов в C# WPF, сетевых и многопоточных приложениях, чтобы помочь мне здесь. Благодарю.

+0

если вы в состоянии использовать .net 4 или 4.5, я бы предложил изучить параллельность задач: http://msdn.microsoft.com/en-us/library/dd537609 .aspx Он предоставляет опцию для длинных потоков запуска –

+0

while loop? Что в то время как цикл? на разных портах?Обычно серверы не разработаны таким образом, как правило, на одном порту есть только один поток прослушивания, а затем один клиентский <> серверный поток для каждого соединения. –

+0

Если ваше приложение умирает через 4-5 часов, попробуйте проверить, сколько гнезд застряло в TIME_WAIT с netstat. –

ответ

0

Самый простой способ отладить это - подключить отладчик (Visual Studio может это сделать). Затем посмотрите, что делают потоки. Чтобы использовать VS для отладки, перейдите в Debug -> Attach To Process и выберите свой процесс. Если это не сработает, вы можете попытаться сбросить этот процесс с помощью диспетчера задач (если у вас есть Windows 7 или выше), просто щелкните правой кнопкой мыши процесс и выберите «Создать файл дампа». Затем вы можете выполнить автономный анализ файла с помощью windbg или VS. Самое полезное, на что вы захотите посмотреть, это то, что делают потоки, когда он заблокирован. Обычно это лучшие первые шаги для этого типа проблем.

0

В Visual Studio является concurrency visualizer

Я хотел бы использовать, что (я думаю, что его Ивеко, так как VS 2010. Это также может быть подключен к внешнему процессу (например, Visual Studio Debugger может также.

Также вас может рассмотреть использование таких инструментов, как Performance Profiler от redgate

Смежные вопросы