所以这里我的C#代码有问题.. 它正在重复一个接受新连接的线程 但是几分钟后它会在System.dll中出现StackOverflowException
这是我的代码
void DoReceive(SocketAsyncEventArgs args)
{
var client = (TCPClient)args.UserToken;
System.Threading.Thread.Sleep(10);
if (!client.socket.ReceiveAsync(args))
{
//System.Threading.Thread.Sleep(10);
DoReceive(args);
}
}
答案 0 :(得分:2)
无尽的递归导致StackOverflowException
。考虑更改代码:
void DoReceive(SocketAsyncEventArgs args)
{
var client = (TCPClient)args.UserToken;
while (!client.socket.ReceiveAsync(args))
{
System.Threading.Thread.Sleep(10);
}
}
答案 1 :(得分:1)
DoReceive
如果!client.socket.ReceiveAsync(args)重复调用,那么如果这个结果没有改变就会引发StackOverflowException
与Olexander
给出的相同的想法
void DoReceive(SocketAsyncEventArgs args)
{
var client = (TCPClient)args.UserToken;
while (!client.socket.ReceiveAsync(args))
{
System.Threading.Thread.Sleep(100);
}
}
答案 2 :(得分:0)
每次ReceiveAsync返回false时,都会递归调用DoReceive。看起来ReceiveAsync通常会返回false,导致程序内存不足。
来自MSDN
[StackOverflowException]“在执行堆栈溢出时抛出,因为它包含太多嵌套方法调用”
您可以设置静态变量以保留重试次数,并在达到限制后退出。