StackOverflowException in System.dll
本文关键字:dll System in StackOverflowException | 更新日期: 2023-09-27 18:03:37
所以这里我有一个问题与我的c#代码。它在重复一个线程来接受新的连接但它得到StackOverflowException在System.dll几分钟后
我的代码
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);
}
}
无限递归导致StackOverflowException
。考虑修改代码:
void DoReceive(SocketAsyncEventArgs args)
{
var client = (TCPClient)args.UserToken;
while (!client.socket.ReceiveAsync(args))
{
System.Threading.Thread.Sleep(10);
}
}
重复调用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);
}
}
每次ReceiveAsync返回false时都递归地调用DoReceive。看起来ReceiveAsync经常返回false,导致程序内存不足。
从MSDN[StackOverflowException] "当执行堆栈因为包含太多嵌套方法调用而溢出时抛出"
可以设置一个静态变量来记录重试次数,并在达到限制后退出。