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

DoReceiveは、ReceiveAsyncがfalseを返すたびに再帰的に呼び出されます。ReceiveAsyncがfalseを返すことが多く、プログラムのメモリが不足しているようです。

MSDNから

[StackOverflowException]「ネストされたメソッド呼び出しが多すぎるために実行スタックがオーバーフローするとスローされます」


静的変数を設定して、再試行の回数を保持し、制限に達した後に終了することができます。

于 2013-03-13T13:22:19.690 に答える