2013-04-30 136 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」的數量比「1」高5%。這意味着我的客戶端線程的過程被調用的次數比實際請求的多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)後會發生什麼情況? – 2013-04-30 03:12:21

+0

我在HandleClientComm中關閉連接(...) – Tutankhamen 2013-04-30 03:38:42

+0

您是否檢查了日誌中的錯誤? – gkovacs90 2013-04-30 12:30:51

回答

0

問題是由自身重新啓動Visual Studio和重建項目後解決。我不知道該說些什麼。

+0

呵呵 - 你不需要說什麼:) – 2013-04-30 08:47:29