условно beginReceive

Пиша клиентска програма, която използва Sockets. Бих искал клиентът да получава асинхронно, ОСВЕН АКО не очаква отговор, в който случай бих искал да получавам синхронно.

Текущият ми проблем е, че тъй като трябва да направя повикване към socket.BeginReceive, което чака, докато има данни в буфера, асинхронното извикване винаги се случва преди синхронизиращото повикване..

Как мога временно да спра изпълнението на BeginReceive? Има ли начин да извикам EndReceive и след като приключа синхронното получаване, мога да продължа да получавам асинхронно?


person sbenderli    schedule 14.09.2009    source източник
comment
Бих предложил да използвате асинхронни отговори за всичко, но нека вашият манипулатор на асинхронно получаване да поддържа някакъв списък с чакащи синхронни заявки и свързаните обратни извиквания. Ако види данни, които биха уважили чакаща синхронна заявка, накарайте го да направи свързаното обратно извикване. Кодът, който прави синхронна заявка, може след това да поиска известие, когато пристигне отговорът, и да изчака такова известие.   -  person supercat    schedule 10.02.2014


Отговори (1)


Доколкото знам, няма начин да спрете късо съединение на BeginReceive от изключване на Socket. За да направите това, което се опитвате да постигнете, ще трябва да преместите повикванията си към използване на напълно синхронно и да поставите повикванията, които искате да направите асинхронно, в отделни нишки. След това ще затворите/поставите на пауза нишката, когато искате да направите допълнително повикване. Можете също така да зададете свойството ReceiveTimeout на нещо ниско и да продължи да цикли, докато не види заявка за спиране, като задаване на променлива за целия клас.

Просто заради любопитството, защо искате да направите синхронно повикване, ако вече получавате асинхронно?

person Community    schedule 14.09.2009
comment
Причината, поради която бих искал да има както синхронизиране, така и асинхронизиране, е, че клиентът ми получава 2 вида съобщения: 1-пита сървъра нещо и очаква и отговаря, което е по-лесно за изпълнение чрез синхронизиране, 2-сървърът изпраща неочаквано, но важно съобщение, в който случай е най-разумно да използвате асинхронно приемане. Сега, ако няма начин да комбинирам двата стила, ще трябва да изпълня стъпка 1 в асинхронен режим. Единственият ми проблем е, че понякога трябва да изпращам множество команди и да очаквам отговори и сървърът може да не реагира достатъчно бързо, което води до объркване на отговорите - person sbenderli; 15.09.2009
comment
Дори ако изключите отговор синхронно, пак може да отнеме известно време, докато отговорът бъде напълно получен, дори ако е в локална мрежа. Също така мисля, че не разбирате как работи Read/BeginRead. Когато извиквате синхронно четене, вие казвате на сокета да блокира, докато има налични данни, а когато има данни в TCP буфера, той ще се деблокира и вашият получаващ буфер ще бъде запълнен. Но дори ако Socket получи информация, докато нямате Read/BeginRead up, тези данни ще останат в буфера за получаване, докато не извикате друго Read. - person ; 15.09.2009