Программирование на сокете: могут ли асинхронные методы отправки и чтения обеспечить порядок данных? - PullRequest
3 голосов
/ 06 августа 2011

Если я вызываю асинхронный метод c # непрерывно, как показано ниже:

</p> <pre class="lang-cs prettyprint-override"><code>socket.BeginSend(data1, 0, data1.Length, 0, new AsyncCallback(SendCallback1), handler); socket.BeginSend(data2, 0, data2.Length, 0, new AsyncCallback(SendCallback2), handler);

Может ли асинхронный метод обеспечить порядок данных?

Считают ли проблему другие сетевые библиотеки, поддерживающие асинхронную работу?как они реализованы для обеспечения внутреннего порядка данных в асинхронной работе?

Ответы [ 3 ]

2 голосов
/ 06 августа 2011

Нет, я не думаю, что асинхронный метод гарантировал бы, что отправляемые вами данные будут отправлены в порядке или при вызове, или при отправке.

Как сказал Марк, даже если он работает, обратите внимание, что это неправильный подход, вам не следует вызывать два BeginSend рядом или один за другим. То, что вы можете сделать, это вызвать EndSend в методе обратного вызова первого BeginSend, а затем внутри этого обратного вызова вызвать следующий BeginSend.

Это хорошая статья MSDN на эту тему, сначала прочтите ее, прежде чем двигаться вперед

1 голос
/ 06 августа 2011

Обычно вы выполняете только второй BeginSend внутри обратного вызова из первого, после вызова EndSend.Я на самом деле надеюсь, что библиотека выдаст исключение, если уже был незавершенный BeginSend в процессе.Но если он не выбрасывает - я сомневаюсь, что порядок будет гарантирован (сомневаюсь, что и успех будет гарантирован).

Вы могли бы также рассмотреть асинхронную CTP, которая имеет продолжения для такого родавещь, позволяющая вам «ждать» отправки и затем выполнять дополнительную работу как продолжение.

0 голосов
/ 06 августа 2011

В вашем примере BeginSend вызывается тем же потоком, поэтому в этом случае будет порядок.

Если бы вы вызывали BeginSend из разных потоков, вам нужно было бы синхронизировать их с помощью мониторов.

Более подробная информация здесь: Сколько запросов асинхронного сокета может выполняться в одном сокете?

...