2013-03-13 63 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]


您可以設置一個靜態變量保持的重試次數「是當執行堆棧溢出,因爲它包含了太多的嵌套的方法調用拋出」和在達到極限後退出。

相關問題