Пример асинхронного клиентского сокета из MSDN

У меня есть вопрос об этом примере: Асинхронный клиентский сокет . Там написано, что операции асинхронные и они ЯВЛЯЮТСЯ (представлены beginxxx/endxxx), но используют ManualResetEvent и если я правильно понял код примера - такие вызовы:

  Receive(client);
  receiveDone.WaitOne();

Заблокирует поток, из которого они были вызваны. Так что, если у меня есть приложение с пользовательским интерфейсом, и я вызываю этот код асинхронного сокета из основного потока - приложение зависнет... Или я ошибаюсь? Извините, я ожидал асинхронно отправлять/получать некоторые команды по tcp без зависания основного потока. Придется ли мне вызывать все операции сокета из этого образца, чтобы избежать зависания?


person 0x49D1    schedule 19.04.2012    source источник
comment
Пример для консольного приложения. Я думаю, что это имело бы больше смысла в приложении с графическим интерфейсом, потому что вы могли бы иметь обратный вызов получения, отображающий обновления для представления, а функция отправки вызывается только при нажатии кнопки (или каком-либо другом событии). Единственная причина для блокировки в этом примере — обеспечить линейные события подключения, отправки, получения, закрытия, а также предотвратить выход программы до завершения обратных вызовов.   -  person styfle    schedule 16.09.2012


Ответы (2)


Да, этот код настроен так, что он будет работать синхронно. Однако вы можете легко использовать вызовы Beginxxx и Endxxx самостоятельно, а не оборачивать их, как написан этот (плохой) пример асинхронного действия.

Для дальнейшего разъяснения, в статье каждый метод запускается асинхронно, но затем блокируется с использованием blocker.WaitOne(); Лучший подход к чему-то подобному может заключаться в том, чтобы ваш обратный вызов beginconnect запускал отправку, а обратный вызов вызывал получение и т. д.

Вы также можете использовать TPL и воспользоваться их ContinueWith, чтобы сделать это. Тогда ваш код может даже выглядеть чище :)

person Justin Pihony    schedule 19.04.2012
comment
@ 0x49D1 Часто это правильно, но, как и во всем в жизни, вы никогда не должны соглашаться с чем-то только потому, что оно исходит из определенного места (а вы этого не сделали, и это хорошо :)). Кроме того, часто статьи MSDN пишут посторонние (здесь я этого не вижу), так что это не всегда прямо из Редмонда. - person Justin Pihony; 19.04.2012

Это заблокировало бы пользовательский интерфейс. Пример MSDN демонстрирует асинхронность, но очень плохо. Тоже примитивно. Пожалуйста, посмотрите эту тему, на которую я также только что ответил относительно различных моделей асинхронного программирования. Я обсуждаю довольно много и предоставляю ссылки на все из них с полными примерами.

Ссылка: Нужна помощь в реализации многопоточности в C#

person David Anderson    schedule 19.04.2012
comment
Спасибо, ребята, за ответы.. Боялся, что задал какую-то глупость, а оказалось, что правильно понял. @ Дэвид Андерсон, спасибо за примеры! - person 0x49D1; 19.04.2012