2012-02-05 94 views
-3

我猜這並不因爲StreamReader的是非線程安全的工作,(不知道HOWTO解決這個問題,谷歌是沒有幫助)StreamReader線程安全問題?可能?

反正我一直在試圖弄清楚究竟什麼錯這個代碼在80%的時間內工作,其他時候它無法解析傳入的數據包,並且會丟棄它們。

這是一個類似於http的tcp服務器的虛擬寫入。它的工作方式與http數據包完全相同,但「CONTENT-LENGTH」標題告訴它數據包數據(有效負載)的長度。這是問題發生的地方。任何人都可以向我建議如何改善這一點並解決這個問題?因爲我完全失去了。

void InternalStart() 
    { 

     bool continueWhile = true; 
     while (continueWhile) 
     { 
      if (SR.EndOfStream) 
      { 
       continueWhile = false; 
       break; 
      } 
      if (par_ReadStatus != ReadStatusEnum.WaitingForPayload) 
      { 
       int charCode = SR.Peek(); 
       if (charCode == -1) 
       { 
        continueWhile = false; 
        break; 
       } 
       string outputLine = ""; 
       outputLine = SR.ReadLine(); 
       ReadLine(outputLine); 
      } 
      else if (par_ReadStatus == ReadStatusEnum.WaitingForPayload) 
      { 
       int length = int.Parse(par_ParsingPacket.Attributes["CONTENT-LENGTH"]); 
       char[] array = new char[length]; 
       for (int i = 0; i < length; i++) 
       { 
        array.SetValue(Convert.ToChar(SR.Read()), i); 
       } 
       string payload = new string(array); 
       ReadLine(payload); 
      } 
     } 
     if (ReadEnd != null) 
     { 
      ReadEnd(); 
     } 
    } 
+0

您能否提供有關您遇到的錯誤的更多詳細信息? – 2012-02-05 07:29:01

+0

[StreamWriter多線程C#]的可能重複(http://stackoverflow.com/questions/19304209/streamwriter-multi-threading-c-sharp) – Liam 2015-04-28 14:13:34

回答

3

StreamReader的是非線程安全的,(不知道HOWTO解決這個問題,谷歌是沒有幫助)

簡單。初級程序員級別:不要從多個線程中讀取StreamReader。試圖這樣做的設計是未能理解流是什麼以及多線程編程的效率如何。

根本不需要多個線程擊中單個流讀取器。您必須先隔離線程,並在處理數據時將流讀取器專用於特定的線程。如果你想變得專業和快速,你就像IIS一樣工作,並在基礎設施線程中吸收數據,然後將工作數據包傳送到工作隊列中,從而多線程工作。

根據不同的性能要求,您可能需要脫離套接字並使用異步套接字機制來確保您不會浪費1000個線程,以1000美元的運行成本,而且沒有任何好處。

無論如何,我一直在試圖弄清楚究竟什麼不對的代碼,

啊 - 試不錯。可悲的是,你既不告訴我們你真的有什麼問題,也沒有你的代碼使用線程顯示任何東西,所以最終你的問題和代碼沒有任何意義上的結合。

+0

好吧。謝謝 :) – Harold 2012-02-05 09:11:18