TPL по сравнению с реактивной платформой

Когда можно было бы принять решение использовать Rx по TPL, или эти 2 платформы являются ортогональными?

Из того, что я понимаю, что Rx, прежде всего, предназначается, чтобы обеспечить абстракцию по событиям и позволить состав, но он также допускает обеспечение абстракции по асинхронным операциям. использование перегрузок Createxx и перегрузок Fromxxx и отмены через расположение возвращенного IDisposable.

TPL также обеспечивает абстракцию для операций через способности к отмене и Задачу.

Моя дилемма - когда использовать который и для какой сценарии?

41
задан Sidhartha Shenoy 3 July 2014 в 12:25
поделиться

3 ответа

Основная цель Rx - не предоставлять абстракцию по событиям. Это лишь один из ее результатов. Его основная цель - предоставить составную модель push-уведомлений для коллекций.

Реактивная структура (Rx) основана на IObservable , который является математическим двойником IEnumerable . Таким образом, вместо того, чтобы «извлекать» элементы из коллекции с помощью IEnumerable , мы можем «проталкивать» нам объекты через IObservable .

Конечно, когда мы действительно ищем наблюдаемые источники, такие вещи, как события и асинхронные операции, являются отличными кандидатами.

Реактивная структура, естественно, требует многопоточной модели, чтобы иметь возможность отслеживать источники наблюдаемых данных и управлять запросами и подписками. Rx на самом деле интенсивно использует TPL для этого.

Итак, если вы используете Rx, вы неявно используете TPL.

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

Но если у вас есть источники данных, которые вы хотите отслеживать и выполнять запросы, я настоятельно рекомендую реактивный фреймворк.

44
ответ дан 27 November 2019 в 00:21
поделиться

Некоторые рекомендации, которым я люблю следовать:

  • Имею ли я дело с данными, которые не были созданы мной? Данные, которые поступают, когда им угодно? Потом RX.
  • Я инициирую вычисления и мне нужно управлять параллелизмом? Потом ТПЛ.
  • Управляю ли я несколькими результатами, и мне нужно выбирать из них в зависимости от времени? Потом RX.
24
ответ дан 27 November 2019 в 00:21
поделиться

Мне нравятся пункты списка Скотта В. Чтобы привести еще несколько конкретных примеров в Rx действительно хорошо отображается на

  • потребляющие потоки
  • , выполняющие неблокирующую асинхронную работу, как веб-запросы.
  • потоковые события (либо события .net, такие как движение мыши, ИЛИ события типа сообщения служебной шины)
  • Объединение «потоков» событий вместе
  • Операции в стиле Linq
  • Предоставление потоков данных из вашего общедоступного API

TPL похоже, хорошо соответствует

  • внутреннему распараллеливанию работы
  • выполнение неблокирующей асинхронной работы, такой как веб-запросы
  • выполнение рабочих потоков и продолжений

Одна вещь, которую я заметил с IObservable (Rx), - это то, что она становится повсеместной . Попав в вашу базу кода, поскольку он, несомненно, будет отображаться через другие интерфейсы, в конечном итоге он появится во всем вашем приложении. Думаю, сначала это может показаться пугающим, но теперь большая часть команды чувствует себя комфортно с Rx, и им нравится объем работы, который он нам помогает.

IMHO Rx будет доминирующей библиотекой над TPL, поскольку он уже поддерживается в .NET 3.5, 4.0, Silverlight 3, Silverlight 4 и Javascript. Это означает, что вам необходимо изучить один стиль, и он применим ко многим платформам.

РЕДАКТИРОВАТЬ : Я изменил свое мнение о том, что Rx доминирует над TPL. Они решают разные проблемы, поэтому их не стоит так сравнивать.В .NET 4.5 / C # 5.0 ключевые слова async / await еще больше свяжут нас с TPL (что хорошо). Для более подробного обсуждения Rx, событий, TPL и т. Д. Ознакомьтесь с первой главой моей онлайн-книги IntroToRx.com

12
ответ дан 27 November 2019 в 00:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: