[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 об этом ничего не говорит. Это баг фреймворка или все-же я чего-то недосмотрел?
Re: [bug?] неадекватное поведение IAsyncResult.AsyncWaitHand
От: Smarty Россия  
Дата: 31.07.05 07:13
Оценка:
Здравствуйте, Васильич, Вы писали:

В>При запуске сего творения оказалось, что WaitOne() завершает работу практически сразу


Что значит "завершает"? Не блокирует текущую нить, что ли? И было бы не фигово посмотреть, а что там в колбэке вообще творится...
Re[2]: [bug?] неадекватное поведение IAsyncResult.AsyncWaitH
От: Васильич  
Дата: 01.08.05 05:45
Оценка:
Здравствуйте, Smarty, Вы писали:

S>Здравствуйте, Васильич, Вы писали:


В>>При запуске сего творения оказалось, что WaitOne() завершает работу практически сразу


S>Что значит "завершает"? Не блокирует текущую нить, что ли? И было бы не фигово посмотреть, а что там в колбэке вообще творится...


Все, вопрос снимается, прошу прощения за потерянное время. Баг оказался в кривых руках и в невнимательном чтении документации
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.