System.dll中的StackOverflowException

时间:2013-03-13 13:15:34

标签: c# system stack-overflow

所以这里我的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);
    }
}

3 个答案:

答案 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]“在执行堆栈溢出时抛出,因为它包含太多嵌套方法调用”


您可以设置静态变量以保留重试次数,并在达到限制后退出。