2012-02-05 115 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