асинхронные сокеты
От: VVVa  
Дата: 22.01.18 05:53
Оценка:
подпрограммы ConnectCallback, ReceiveCallback, SendCallback в примере вызываются в новом потоке ? сколько таких потоков он может вызвать?

Почему в этих подпрограммах мы вызываем .EndSend .EndReceive с параметром (для чего этот папаметр нужен)?
Re: асинхронные сокеты
От: Nikolay_Ch Россия  
Дата: 22.01.18 06:03
Оценка:
Здравствуйте, VVVa, Вы писали:

VVV>подпрограммы ConnectCallback, ReceiveCallback, SendCallback в примере вызываются в новом потоке ? сколько таких потоков он может вызвать?

Во-первых — не подпрограммы, а методы, а во-вторых — кто ОН?

VVV>Почему в этих подпрограммах мы вызываем .EndSend .EndReceive с параметром (для чего этот папаметр нужен)?

Потому, что надо посмотреть в документацию и прочитать, как работает BeginЧто-то и зачем потом надо вызывать EndЧто-то и что за параметр там передается.
Отредактировано 22.01.2018 6:04 Nikolay_Ch . Предыдущая версия .
Re[2]: асинхронные сокеты
От: VVVa  
Дата: 22.01.18 06:25
Оценка:
N_C>Потому, что надо посмотреть в документацию и прочитать, как работает BeginЧто-то и зачем потом надо вызывать EndЧто-то и что за параметр там передается.

прочитал непомогло ;( дак эти методы в отдельных потоках будут вызваны?
Re[3]: асинхронные сокеты
От: Mr.Delphist  
Дата: 22.01.18 13:11
Оценка: +1
Здравствуйте, VVVa, Вы писали:


N_C>>Потому, что надо посмотреть в документацию и прочитать, как работает BeginЧто-то и зачем потом надо вызывать EndЧто-то и что за параметр там передается.


VVV>прочитал непомогло ;( дак эти методы в отдельных потоках будут вызваны?


Дык уже ж отвечали на похожее https://rsdn.org/forum/network/7015328
Автор: VVVa
Дата: 10.01.18


Колбэки зовутся асинхронно, в другом потоке. Таких асинхронных вызовов может быть несколько одновременно. В каком потоке дёргать колбэк (в одном и том же или каждый раз в разных), решает система.

Как разобраться, какой колбэк относится к какому асинхронному запросу? Надо запоминать результаты BeginXXX-вызовов (тут в примерах от MS провал, конечно). Т.е. begin-метод вернул IAsyncResult, запомнили где-то у себя. Далее колбэк будет позван с тем же экземпляром IAsyncResult. Ну и в конце дёргаем end-метод с тем же IAsyncResult, чтобы оно не висело в системе мёртвым грузом незавершённых асинхронностей.

Например, коннектимся таким псевдокодом:

a1 = BeginConnect(google);
a2 = BeginConnect(facebook);
a3 = BeginConnect(instagram);

далее где-то в другом потоке оно системой дёргается, например, в таком порядке:

ConnectCallBack(a1);
ConnectCallBack(a3);
ConnectCallBack(a2); // например, фейсбук где-то стормозил и отстал
Re: асинхронные сокеты
От: Слава  
Дата: 22.01.18 18:08
Оценка:
Здравствуйте, VVVa, Вы писали:

VVV>сколько таких потоков он может вызвать?


Есть пул потоков под IO, его размер может меняться как автоматически, так и вручную.

VVV>Почему в этих подпрограммах мы вызываем .EndSend .EndReceive с параметром (для чего этот папаметр нужен)?


Я бы рекомендовал с этим вообще не связываться, а использовать Task'и.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.