Обратите внимание, что большинство *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.