C # Async Sockets (* Async, SocketAsyncEventArgs) - PullRequest
1 голос
/ 11 января 2010

Я работал с API-интерфейсом асинхронных сокетов .NET 3.5 и обнаружил, что все из методов * Async возвращают логическое значение, равное false, если операция завершена синхронно.

Я немного озадачен тем, как / почему это могло произойти. Это не всегда условие ошибки, верно? В этом случае примеры MSDN немедленно вызывают обработчик события вручную. Это хорошая практика для подражания?

Кроме того, когда я, например, вызываю Socket.SendAsync и присоединяю обработчик к SocketAsyncEventArgs.Completed, я гарантирую, что «Completed» запускается (или SendAsync возвращает false) только после все моих данных отправлено? Или возможно, что он вызовет мой обработчик где-то посередине?

1 Ответ

2 голосов
/ 11 января 2010

Может возвращаться синхронно, если запрошенное действие может быть выполнено мгновенно, например, если буфер TCP уже содержит данные, необходимые для завершения метода ReceiveAsync, или клиент уже ожидает принятия ect.

Примеры обработчика, потому что AsyncMethod не будет. Я был бы рад использовать вызывать обработчик непосредственно в этом случае (если есть только одна подписка). Однако есть практика, которая предполагает, что вы не должны этого делать, скорее, обработчик не должен делать ничего, кроме вызова другого метода (возможно, с более значимыми параметрами), который обрабатывает логику, и что вы должны вызывать этот метод, а не фактическое событие / обработчик.

Событие не будет вызвано до завершения операции, если, конечно, вы не сделаете это вручную, когда асинхронный метод вернет true (не завершено).

Из MSDN:

Возвращает true , если операция ввода-вывода находится в состоянии ожидания. Событие SocketAsyncEventArgs.Completed для параметра e будет вызвано при завершении операции.

Возвращает false , если операция ввода-вывода завершена синхронно. В этом случае событие SocketAsyncEventArgs.Completed для параметра e не будет вызвано , и объект e, переданный в качестве параметра, может быть проверен сразу после возврата вызова метода для получения результата операции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...