Сколько моделей асинхронной разработки в .NET? - PullRequest
8 голосов
/ 14 февраля 2012

Я изучаю асинхронное программирование с использованием C # и обычно использую BeginInvoke, но я не очень уверен насчет других методов создания асинхронного приложения.

Я задал вопрос по этому поводу, см. Ссылку ниже для получения более подробной информации:

Как вернуть значение T из BeginInvoke?

В приведенной выше ссылке Гравелл сказал, что существует четыре модели асинхронного развития

По крайней мере, 4, то обычный вызов (не APM, не EAP) также не редкость

Но Переполнение сказал, что их три:

В .NET

есть 3 модели асинхронной разработки.
  • APM - (BeginXXX / EndXXX), который вы здесь используете, когда долгосрочное задание завершается, оно вызывает ваш код в методе EndXXX

  • EAP - на основе событий. В этой модели, когда долгое выполнение задачи завершается, возникает событие для информирования вашего кода.

  • TPL - Новое в .NET 4, это версия для задач. Это больше всего похоже на синхронное программирование клиентского кода с использованием свободного интерфейса. Он вызывает ваш код, используя ContinueWith.

Кто-нибудь может мне помочь в этом?

Я много раз искал на google.com, но на самом деле они чаще всего используют BeginInvoke. спасибо за вашу помощь.

Ответы [ 3 ]

4 голосов
/ 14 февраля 2012

Thread.Start - жестокий

delegate.BeginInvoke/EndInvoke - «старый» стандарт

ThreadPool.QueueUserWorkItem - умный

TaskFactory.StartNew - единственный способ сделать это правильно (согласно Patterns of parallel programming book |, я рекомендую вам сначала прочитать его для устранения неоднозначности)

2 голосов
/ 15 февраля 2012

Есть много вещей, которые можно уловить в термине "асинхронная разработка".


Например, вы можете выполнить код в фоновом потоке .Недавно я обновил мой блог , в котором противопоставлены несколько общих подходов к выполнению кода в фоновом режиме.Вот список в порядке от наиболее желательного к наименьшему:

  1. Task (используется async / await).
  2. Task (используется библиотекой параллельных задач).
  3. BackgroundWorker.
  4. Delegate.BeginInvoke.
  5. ThreadPool.QueueUserWorkItem.
  6. Thread

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

  1. Task (в стиле Асинхронный шаблон на основе задач (TAP) )
  2. IAsyncResult с методами Begin* / End* (с неудачным названием Модель асинхронного программирования (APM) ).
  3. Компонент, написанный с использованием Асинхронный шаблон на основе событий (EAP) .

(Примечание: BackgroundWorker - это EAP, а Delegate.BeginInvoke - это APM).

С другой стороны, вы можете иметь в виду асинхронное программирование в целом, что можно интерпретировать как реактивный подход.В этом случае мне известны только два подхода:

  1. Реактивные расширения (Rx) .
  2. Асинхронный шаблон на основе событий (EAP) .

Однако вы могли бы доказать, что любая программа, управляемая событиями, до некоторой степени реагирует, поэтому простая обработка событий пользовательского интерфейса является (простой)форма «асинхронного программирования».

Кроме того, это только общие модели.Любая платформа или библиотека может добавить больше.Вот некоторые из них:

  • Класс Socket имеет специальную форму APM, которую можно использовать для минимизации выделения памяти.Он работает очень похоже на APM, но не соответствует шаблону.
  • Среда выполнения WinRT (в Windows 8) имеет собственные представления асинхронных операций (IAsyncOperation<TResult> и IAsyncInfo).
  • Windows Phone имеет специальную поддержку фонового агента , который позволяет запускать код в фоновом режиме, даже если ваше приложение в данный момент не работает.
1 голос
/ 14 февраля 2012

Безусловно, будет полезно изучить методы, которые Микант описал для асинхронной разработки.Хотелось бы напомнить вам, что C # 5.0 полностью меняет дизайн языка в отношении асинхронности.Это будет его основной темой наряду с введением двух новых ключевых слов, async и await.Вы просто вызываете await для долго выполняющейся задачи, и она начнет задачу и вернет управление вызывающему методу.Как только задача завершена, она переходит к остальной части кода.

Вот отличное видео для полной информации о его использовании и объяснения.В нем описан не только старый способ выполнения асинхронных операций, но и полный обзор нового стиля.Это делает написание асинхронных приложений на тонну проще и намного более читабельным с естественным потоком.

Это будущее асинхронного поведения C #, которое стоит изучить.

http://channel9.msdn.com/events/PDC/PDC10/FT09/

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