2013-03-13 60 views
1

所以在这里我有一个问题,我的C#代码.. 它重复一个线程几分钟StackOverflowException在System.dll中

这里后接受新的连接 但它变得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); 
    } 
} 
+3

您正在递归调用DoReceieve,这会导致SOE。从异常情况下的堆栈跟踪中可以明显看出,如果你调试了。 =) – 2013-03-13 13:18:04

+0

如何防止这件事? :S – 2013-03-13 13:20:20

+0

如何使用while循环和重试限制?这比递归地重试所有永恒更为常见。 =) – 2013-03-13 13:22:00

回答

2

无尽的递归导致StackOverflowException。考虑更改您的代码:

void DoReceive(SocketAsyncEventArgs args) 
{ 
    var client = (TCPClient)args.UserToken;   
    while (!client.socket.ReceiveAsync(args)) 
    { 
     System.Threading.Thread.Sleep(10); 
    } 
} 
+0

我现在正在尝试你的解决方案:)我会告诉这是它的工作:)预先感谢你:) – 2013-03-13 13:35:09

+0

它必须工作:)我还会提供一些超时或ReceiveAsync的有限时间尝试以防止无限循环的情况下没有什么是由套接字发送的。但这当然取决于你的逻辑。 – Olexander 2013-03-13 13:53:10

+0

这是伟大的工作:D谢谢你兄弟的所有帮助..非常感谢:D – 2013-03-13 15:38:07

1

DoReceive一再呼吁,如果!client.socket.ReceiveAsync(参数),那么如果这个结果没有改变将引发StackOverflowException

同样的想法是Olexander给予

void DoReceive(SocketAsyncEventArgs args) 
{ 
    var client = (TCPClient)args.UserToken;   
    while (!client.socket.ReceiveAsync(args)) 
    { 
     System.Threading.Thread.Sleep(100); 
    } 
} 
+0

我该如何阻止SOE?我需要在此做另一个if函数? – 2013-03-13 13:22:01

0

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

MSDN

[StackOverflowException]


您可以设置一个静态变量保持的重试次数“是当执行堆栈溢出,因为它包含了太多的嵌套的方法调用抛出”和在达到极限后退出。

相关问题