Доброго времени суток всем. При написании проекта столкнулся со следующей неожиданной проблемой. Имеем кусок следующего кода (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 об этом ничего не говорит. Это баг фреймворка или все-же я чего-то недосмотрел?
Здравствуйте, Smarty, Вы писали:
S>Здравствуйте, Васильич, Вы писали:
В>>При запуске сего творения оказалось, что WaitOne() завершает работу практически сразу
S>Что значит "завершает"? Не блокирует текущую нить, что ли? И было бы не фигово посмотреть, а что там в колбэке вообще творится...
Все, вопрос снимается, прошу прощения за потерянное время. Баг оказался в кривых руках и в невнимательном чтении документации