Разница между [...] Async и Begin [...] .net асинхронными API - PullRequest
16 голосов
/ 21 июня 2010

Может кто-нибудь объяснить мне, в чем разница между асинхронным шаблоном API [...] Begin [...] / End [...] и последующим [...] шаблоном асинхронности в .NET 3.5?

  • Почему был создан позже?
  • Почему один предпочитает один шаблон другому?

Например, Socket.BeginAccept () и Socket.AcceptAsync ().

Ответы [ 2 ]

16 голосов
/ 21 июня 2010

Обратите внимание, что большинство *Async методов (с соответствующими *Completed событиями) используют Асинхронный шаблон на основе событий . Более старый (но все еще совершенно действительный) Begin* и End* - это шаблон, называемый Модель асинхронного программирования . Класс Socket является исключением из этого правила; его *Async методы не имеют соответствующих событий; по сути, это просто APM, выполненный таким образом, чтобы избежать чрезмерного выделения памяти.

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

Однако и APM, и EBAP заменяются гораздо более гибким подходом, основанным на Task Parallel Library . Поскольку TPL может легко обернуть APM, старые классы, скорее всего, не будут обновляться напрямую; методы расширения используются для предоставления Task эквивалентов для старых методов APM.

Обновление 2012-07-14: Я ошибся, когда сказал, что "старые классы, скорее всего, не будут обновляться напрямую". По соображениям производительности команды BCL / TPL решили рассмотреть каждый тип BCL и добавить методы TAP напрямую, а не использовать методы расширения. Эти изменения будут в .NET 4.5.

12 голосов
/ 21 июня 2010

MSDN ответит лучше меня:

http://msdn.microsoft.com/en-us/library/system.net.sockets.socketasynceventargs.aspx

Основной особенностью этих улучшений является предотвращение повторного выделения и синхронизации объектов во время большого объемаасинхронный сокет ввода / вывода.Шаблон проектирования Begin / End, в настоящее время реализуемый классом System.Net.Sockets.Socket, требует, чтобы объект System.IAsyncResult был выделен для каждой асинхронной операции сокета.

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