【发布时间】:2010-04-07 20:05:02
【问题描述】:
以下代码在并行化到 4-5 个线程时运行良好,但随着线程数增加到超过 10 个并发线程时开始失败
int totalRecieved = 0;
int recieved;
StringBuilder contentSB = new StringBuilder(4000);
while ((recieved = socket.Receive(buffer, SocketFlags.None)) > 0)
{
contentSB.Append(Encoding.ASCII.GetString(buffer, 0, recieved));
totalRecieved += recieved;
}
Recieve 方法返回读取的字节为零,如果我继续调用recieve 方法,我最终会得到异常'已建立的连接被主机中的软件中止'。所以我假设主机实际上发送了数据然后关闭了连接,但由于某种原因我从未收到它。
我很好奇为什么当有很多线程时会出现这个问题。我认为这一定与每个线程没有获得尽可能多的执行时间这一事实有关,因此导致此错误的线程有一些空闲时间。只是想不通为什么空闲时间会导致套接字不接收任何数据。
编辑:只是为了澄清。每个线程都有自己的个人套接字读取不同的数据。
【问题讨论】:
-
明确一点,每个线程都有自己的socket?
-
我不清楚的是,如果您有很多线程读取一个套接字或每个线程一个套接字?
-
你知道SocketError代码(SocketException.ErrorCode)吗?可能是超时...
-
如果查看您提供的代码,行为真的很奇怪,似乎一切都很好。每个客户端套接字都托管在自己的线程中,套接字是阻塞类型的,对吗?也许真的是接收超时?
标签: c# .net multithreading sockets networking