StreamReader ThreadSafe问题?可能?

时间:2012-02-05 05:11:44

标签: c# error-handling thread-safety streamreader helpers

我猜这不起作用,因为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();
        }
    }

1 个答案:

答案 0 :(得分:3)

  

StreamReader是非线程安全的,(不知道如何修复它,谷歌没有帮助)

简单。初学者程序员级别:不要从多个线程读取StreamReader。试图这样做的设计是无法理解流是什么以及多线程编程的效率如何。

根本不需要多个线程命中单个流读取器。在处理数据时,您必须先将线程隔离并将流读取器专门绑定到特定线程。如果你想获得专业和快速的工作,你就像IIS一样工作,并在基础设施线程中吸收数据,然后将工作数据包提供给工作队列,多线程就可以解决了。

根据性能要求,您可能希望使用套接字并使用异步套接字机制来确保您不会浪费1000个线程来进行1000次正在进行的操作,而且成本很高而没有任何好处。

  

无论如何,我一直试图弄清楚这段代码究竟是什么问题,

啊 - 很好的尝试。遗憾的是,你既没有告诉我们你真正遇到了什么问题,也没有告诉我们你的代码使用线程显示什么,所以最后你的问题和代码在组合中没有任何意义。