我猜这不起作用,因为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 :(得分:3)
StreamReader是非线程安全的,(不知道如何修复它,谷歌没有帮助)
简单。初学者程序员级别:不要从多个线程读取StreamReader。试图这样做的设计是无法理解流是什么以及多线程编程的效率如何。
根本不需要多个线程命中单个流读取器。在处理数据时,您必须先将线程隔离并将流读取器专门绑定到特定线程。如果你想获得专业和快速的工作,你就像IIS一样工作,并在基础设施线程中吸收数据,然后将工作数据包提供给工作队列,多线程就可以解决了。
根据性能要求,您可能希望使用套接字并使用异步套接字机制来确保您不会浪费1000个线程来进行1000次正在进行的操作,而且成本很高而没有任何好处。
无论如何,我一直试图弄清楚这段代码究竟是什么问题,
啊 - 很好的尝试。遗憾的是,你既没有告诉我们你真正遇到了什么问题,也没有告诉我们你的代码使用线程显示什么,所以最后你的问题和代码在组合中没有任何意义。