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 in System.dll

无限递归导致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] "当执行堆栈因为包含太多嵌套方法调用而溢出时抛出"


可以设置一个静态变量来记录重试次数,并在达到限制后退出。

相关文章: