2013-03-13 2 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. Это было бы очевидно из stacktrace в вашем исключении, и если вы отлаживали. =) –

+0

И как я могу предотвратить эту вещь? : S –

+0

Как насчет использования цикла while и ограничения на повторы? Это более распространено, чем повторение на всю вечность, рекурсивно. =) –

ответ

2

Бесконечная рекурсия ведет к StackOverflowException. Рассмотрите возможность изменения вашего кода:

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

Я сейчас пытаюсь ваше решение :) Я скажу, что это работает :) Спасибо заранее :) –

+0

Он должен работать :) Я также предоставил бы некоторый тайм-аут или ограниченное время попыток ReceiveAsync для предотвращения бесконечного цикла в случае ничто не отправляется сокетом. Но это зависит от вашей логики, конечно. – Olexander

+0

Он отлично работает: D Спасибо, брату за вашу помощь .. высоко ценят: D –

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? –

0

DoReceive вызывается рекурсивно каждый раз, когда ReceiveAsync возвращает ложь. Похоже, что ReceiveAsync чаще возвращает false, что приводит к тому, что ваша программа исчерпает память.

От MSDN

[StackOverflowException] «брошено, когда стек выполнения переполняется, поскольку она содержит слишком много вложенных вызовов метода»


Вы можете установить статическую переменную, чтобы сохранить количество повторных попыток и выйти после того, как вы достигнете предела.

Смежные вопросы