2010-09-18 2 views
2

Я получаю этот комментарий на ADI при чтении Essential C# 4.0:Асинхронный делегат Призвание (ADI) по сравнению с Task Parallel Library (TPL)

К сожалению, лежащая в основе технологии, используемые в асинхронном делегат шаблон вызова является технология дальнейшего развития для распределенного программирования, известного как . И хотя Microsoft все еще поддерживает использование асинхронного делегата вызова и он будет продолжать функционировать, как это делает сегодня в обозримом будущем, то характеристики являются неоптимальных данные другие подходы, а именно нить, Threadpool, и TPL , Поэтому разработчики должны предпочитают одну из этих альтернатив вместо реализации новых разработок с использованием асинхронного API вызовов делегатов . Далее обсуждение шаблона включено в расширенном тексте темы, который следует за тем, чтобы разработчики, с которыми он сталкивается , поймут, как работает .

Существуют ли какие-либо ограничения, которые имеют ADI и TPL, кроме того, что TPL, вероятно, использует технологию, которая еще не разработана для дальнейшего развития?

ответ

2

Вы запрашиваете «ограничения».

Я не думаю, что вы найдете что-то, что не может быть сделано с ADI (также называемым APM). Дело в производительности и программиста.

Вердикт кажется единодушным, Joe Duffy also warns you away от ADI/APM

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

2

Не то, чтобы я эксперт в области TPL. Из того, что я понимаю, TPL-рефераты принимают решения о уровне параллелизма как конфигурации/спецификации.

Например, в параллельном цикле.

Parallel.For (0, 1000, a => Thread.Sleep (10000));

Вы не обязательно создаете 1000 потоков. TPL будет «параллелизироваться» с соответствующим количеством потоков. В отличие от асинхронного вызова метода 1000 раз. (Который также не будет создавать 1000 потоков, но вы просто заблокировали выполнение вызовов до тех пор, пока необходимые ресурсы не будут освобождены.

Кроме того, TPL позволяет вам осуществлять контроль над параллельными задачами более высокого уровня. В приведенном выше примере вы может приостановить/перерыв/прервать для цикла легко Такие, как

Parrallel.For (0, 1000, (а, loopState) => loopState.Break());..

Это немного хлопот достигните вышеуказанного, используя обычный метод асинхронного вызова.

TL, DR: TPL более эффективны и просты в использовании.

3

Задачи и делегаты async используют пул потоков.

Задачи и делегаты async аналогичны в том смысле, что исключение может быть передано вызывающему. Задачи идут еще дальше, накапливая все заброшенные исключения и представляя их для всех работников пула потоков вместе.

Задачи позволяют отменить.

Там свободная глава, которая описывает все это более подробно: http://www.albahari.com/threading/

+0

Фоновая обработка из пользовательского интерфейса является общей проблемой, что делегаты асинхронных пытаются решить. Параллельные вычисления на нескольких ядрах - это проблема, которую Задачи пытаются решить. – GregC

Смежные вопросы