Доброго всем дня!
Есть у меня код с асинхронным приёмом данных. Не до конца понимаю такой момент. Запускается 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();
}