.NET 4.5 Async vs. TPL

Я начинаю читать о .NET 4.5 Async, но, откровенно говоря, не могу получить максимальную отдачу от него, когда придет к использованию. Поэтому я постараюсь получить это с прямым вопросом:

Я обычно использую .NET 4 TPL для вызова дорогостоящих веб-сервисов и вызовов БД изнутри моего приложения ASP.NET. Кажется, я могу добиться того же самого с Async. Это правда? Когда использовать какой?

Спасибо заранее.

Ответ 1

TPL - это библиотека для параллельных вычислений..NET 4.5 async - это языковая функция, построенная поверх TPL, что упрощает процесс. Это особенно актуально, если у вас есть рабочие процессы с несколькими шагами.

В двух словах async позволяет писать код, как если бы он был синхронным, поэтому логический поток остается неповрежденным. Процесс ожидания завершения задачи, выполнение определенного кода, когда это произойдет, можно сделать очень естественным способом с помощью async. Компиляторы С# 5.0 и VB 11.0 преобразуют ваш код в эквивалентный код С# 4.0 и VB 10.0 с использованием TPL и некоторых новых типов async.

Для отличного объяснения async под капотом см. раздел блога Jon Skeet Eduasync.

Итак, как вы решаете, что использовать? Ну, async в основном абстрагирует все сложности создания последовательности фрагментов кода, которые связаны вместе с асинхронными вызовами. Предположительно, когда вы вызываете веб-службу или получаете доступ к базе данных, вы хотите что-то сделать с тем, что возвращается. async позволяет сместить код вызова и обработки вместе, что должно сделать ваш код более легким для записи, а также проще читать позже.

Ответ 2

@Pawan о BeginXXX/EndXXX: Я думаю, вы смешиваете вещи. Посмотрев на С#, есть 3 разных шаблона для запуска параллельного кода:

  • Устаревший: модель асинхронного программирования (APM)
  • Устаревший: асинхронный шаблон на основе событий (EAP)
  • Современный: Асинхронный шаблон на основе задач (TAP)

TPL - это основа, на которой построен TAP. TPL была введена в .NET 4. Alt + TPL и TAP каким-то образом используются одинаково в Microsoftdocumentation. В любом случае, async/await - это только функция языка, введенная с С# 5, означает .NET 4.5, чтобы упростить поддержку TPL.

BeginXXX/EndXXX принадлежит к стилю APM! Таким образом, это не имеет ничего общего с TPL. Эти несколько версий затрудняют сохранение обзора.

Ответ 3

Моя догадка - внутренне и .Net TPL и async, использует потоки threadpool. Async может быть упрощенным синтаксисом для обычного шаблона BeginXXX/EndXXX.

Но что более важно, TPL использует threadflow thread, и вы не должны использовать его для выполнения дорогостоящих операций, поскольку одни и те же потоки используются самой картой. Если у вас есть дорогостоящая операция (как вы уже упоминали), то лучше создать новый автономный поток или установить свойство ThreadSchedular "LongRunning" при использовании TPL.