我猜这是行不通的,因为StreamReader是非线程安全的,(不知道如何解决该问题,谷歌没有帮助)
无论如何,我一直试图弄清楚这段代码有什么问题,它在80%的时间内都能正常工作,而其他时候却无法解析传入的数据包,只会丢弃它们。
对于像HTTP这样的TCP服务器,这是无效的。它的工作原理与http数据包完全相同,但是“CONTENT-LENGTH” header 告诉它数据包数据的长度(有效负载)。这就是问题所在。谁能建议我如何改善并解决此问题?因为我完全迷路了。
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();
}
}
最佳答案
StreamReader being non thread safe, (don't know howto fix that, google is no help)
简单。初级程序员级别:不要从多个线程中读取StreamReader。试图这样做的设计无法理解什么是流以及如何有效地进行多线程编程。
根本不需要多个线程命中单个流读取器。在处理数据时,必须先将线程隔离,然后将流读取器专用于特定线程,然后将其附加到特定线程。如果您想变得专业而又快速,则可以像IIS一样工作,并在基础结构线程中吸收数据,然后将工作包馈入到工作人员队列中,多个线程可以工作。
而且,根据性能要求,您可能需要处理套接字并使用异步套接字机制来确保您不会浪费1000个线程进行1000个正在进行的操作,而代价却是高昂的,没有任何好处。
Anyway i've been trying to figure exactly whats wrong with this code,
啊-不错的尝试。可悲的是,您既没有告诉我们您真正的问题是什么,代码也没有使用线程显示任何内容,因此最后,您的问题和代码组合起来毫无意义。
关于c# - StreamReader ThreadSafe问题?可能吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9147082/