Асинхронное выполнение и ManualResetEvent
От: dalex_v Россия  
Дата: 31.05.10 19:31
Оценка:
Доброго всем дня!

Есть у меня код с асинхронным приёмом данных. Не до конца понимаю такой момент. Запускается Receive, поток блокируется пока в ReceiveCallBack не сработает receiveDone.Set() или пока не истечет 60 секунд. Т.е., если связь ушла в небытие и сокет "завис" — поток с Receive() остаётся где-то там и я им уже не пользуюсь и он мне не мешает. Наступает следующая итерация цикла, снова запускается Receive и снова блокируется поток с помощью WaitOne(). А что будет, если первый поток с Receive() "проснётся" (я так понимаю, что при истечении таймаута поток то остаётся жив) и Receive, вызванный первый раз, вызовет ReceiveCallBack? Получается что произойдёт receiveDone.Set() и пойдёт следующая итерация цикла, при ещё не завершенном втором вызове Receive(). Так ли это, или меня глючит? Пример был сдёрнут с msdn, что должно означать правильное использование (я так думаю).


private static ManualResetEvent receiveDone = new ManualResetEvent(false);

public static void Start(){
       for(int i=0; i<10; i++){
             Receive(stream);
             if (receiveDone.WaitOne(TimeSpan.FromSeconds(60),true))
             {
                  Debug.WriteLine("Получено");
             }
             else
             {
                  Debug.WriteLine("Ошибка получения");
             }
             receiveDone.Reset();
       }
}


private static void Receive(NetworkStream stream)
{
    stream.BeginRead(buff, 0, buff.length, new AsyncCallback(ReceiveCallBack), s);
}

private static void ReceiveCallBack(IAsyncResult ar)
{
        int readed = stream.EndRead(ar);
        receiveDone.Set();
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.