2013-04-30 4 views
1

У меня есть функция потока прослушивателя, которая ждет входящего соединения и запускает новый поток для каждого клиента. Также он пишет: «1», чтобы войти каждый раз, когда он начинает новую нить:Странное поведение многопоточности в C#

void ListenWorkerDoWork(object sender, DoWorkEventArgs e) { 
    try { 
     var tcpListener = new TcpListener(IPAddress.Any, 843); 
     tcpListener.Start(); 
     var worker = sender as BackgroundWorker; 

     if (worker != null) { 
      while (!worker.CancellationPending) { 
       var client = tcpListener.AcceptTcpClient(); 
       var clientThread = new Thread(HandleClientComm) { IsBackground = true }; 
       clientThread.Start(client); 
       Logger.Instance.WriteToLog(Logger.Type.Info, "1"); 
      } 
     } 
    } catch (Exception ex) { 
     Logger.Instance.WriteToLog(Logger.Type.Error, string.Format("An error has occured while listening on port 843:{0}{1}", Environment.NewLine, ex)); 
    } 
} 

и обработки клиента поток, который пишет «2» в лог-файл и обрабатывает входящие соединения:

private void HandleClientComm(object client) { 
    Logger.Instance.WriteToLog(Logger.Type.Info, "2"); 
    [...] 
} 

Также У меня небольшое приложение, которое подключается к серверу каждые 50 мс и отправляет/получает некоторые данные. Если я запускаю только одного клиента, тогда количество «1» и «2» равно, но если я запускаю несколько экземпляров клиента на разных компьютерах, тогда количество «2» на 5% выше, чем «1». Это означает, что процедура моего клиентского потока была вызвана на 5% больше, чем на самом деле. Как это возможно? например, у меня 3 клиента. Каждый клиент выполняет 1000 сеансов с сервером. В результате, у меня есть:

  • 3000 успешных сессий на стороне клиента
  • 3119 количество соединений, принятых сокеты (и записывает «1»)
  • 3273 функция раз клиентский поток назывались

Спасибо!

Обновлено:

Вход Функция Сочинение поточно:

public void WriteToLog(Type type, object message) { 
     lock(writelock) { 
      String str = typeText[(int)type] + DateTime.Now.ToString() + " : " + message.ToString(); 
      Console.WriteLine(str); 
      if (stream != null) { 
       stream.WriteLine(str); 
       stream.Flush(); 
      } 
     } 
    } 
+0

Что произойдет, если вы закроете клиентское соединение [TcpClient.Close] (http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.close.aspx) после его принятия? –

+0

Я закрываю соединение в HandleClientComm (...) – Tutankhamen

+0

Вы проверили журнал на наличие ошибок? – gkovacs90

ответ

0

Проблема была решена сама собой после перезапуска Visual Studio и восстановление проекта. Я не знаю, что сказать.

+0

Хе-хе - вам не нужно ничего говорить :) –

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