[bug?] неадекватное поведение IAsyncResult.AsyncWaitHandle
От: Васильич  
Дата: 30.07.05 19:07
Оценка:
Доброго времени суток всем. При написании проекта столкнулся со следующей неожиданной проблемой. Имеем кусок следующего кода (framework 1.1):

IAsyncResult ar = _socket.BeginReceive(recvBuf, 0, ReceiveBufSize, SocketFlags.None, new AsyncCallback(AsyncReceiveCallback), recvBuf);

ar.AsyncWaitHandle.WaitOne();

// Дальнейшая обработка данных
....


При запуске сего творения оказалось, что WaitOne() завершает работу практически сразу, не дожидаясь реального приема данных из сокета. Танцы с бубном показали, что решить проблему можно, организовав перед вызовом WaitOne() небольшую задержку (например, Thread.Sleep(100); )
Что-же получаем в итоге? Единственное реальное обьяснение этому явлению которое я нашел, это то, что событие (под событием подразумевается объект event ядра NT) AsyncWaitHandle создается в сигнализированном состоянии и лишь в начале работы потока из пула, выделенного под BeginReceive, переводится в несигнализированное состояние. Нечто вроде такого (псевдокод):

BeginReceive()
{
...
ar.AsyncWaitHandle = new ManualResetEvent(true);
...
}

AsyncReceiveWorker()
{
ar.AsyncWaitHandle.Reset();
socket.Receive();
ar.AsyncWaitHandle.Set();
}


Итого, получаем возможную "дырку" в обработке асинхронных операций с сокетами. MSDN об этом ничего не говорит. Это баг фреймворка или все-же я чего-то недосмотрел?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.