1

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

3 回答 3

2

无休止的递归导致StackOverflowException. 考虑更改您的代码:

void DoReceive(SocketAsyncEventArgs args)
{
    var client = (TCPClient)args.UserToken;        
    while (!client.socket.ReceiveAsync(args))
    {
        System.Threading.Thread.Sleep(10);
    }
}
于 2013-03-13T13:23:52.447 回答
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);
     }
}
于 2013-03-13T13:20:09.723 回答
0

每次 ReceiveAsync 返回 false 时都会递归调用 DoReceive。看起来 ReceiveAsync 经常返回 false ,导致您的程序内存不足。

来自MSDN

[StackOverflowException]“当执行堆栈溢出时抛出,因为它包含太多的嵌套方法调用”


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

于 2013-03-13T13:22:19.690 回答