Когда можно было бы принять решение использовать Rx по TPL, или эти 2 платформы являются ортогональными?
Из того, что я понимаю, что Rx, прежде всего, предназначается, чтобы обеспечить абстракцию по событиям и позволить состав, но он также допускает обеспечение абстракции по асинхронным операциям. использование перегрузок Createxx и перегрузок Fromxxx и отмены через расположение возвращенного IDisposable.
TPL также обеспечивает абстракцию для операций через способности к отмене и Задачу.
Моя дилемма - когда использовать который и для какой сценарии?
Основная цель Rx - не предоставлять абстракцию по событиям. Это лишь один из ее результатов. Его основная цель - предоставить составную модель push-уведомлений для коллекций.
Реактивная структура (Rx) основана на IObservable
, который является математическим двойником IEnumerable
. Таким образом, вместо того, чтобы «извлекать» элементы из коллекции с помощью IEnumerable
, мы можем «проталкивать» нам объекты через IObservable
.
Конечно, когда мы действительно ищем наблюдаемые источники, такие вещи, как события и асинхронные операции, являются отличными кандидатами.
Реактивная структура, естественно, требует многопоточной модели, чтобы иметь возможность отслеживать источники наблюдаемых данных и управлять запросами и подписками. Rx на самом деле интенсивно использует TPL для этого.
Итак, если вы используете Rx, вы неявно используете TPL.
Вы могли бы использовать TPL напрямую, если хотите прямой контроль над своими задачами.
Но если у вас есть источники данных, которые вы хотите отслеживать и выполнять запросы, я настоятельно рекомендую реактивный фреймворк.
Некоторые рекомендации, которым я люблю следовать:
Мне нравятся пункты списка Скотта В. Чтобы привести еще несколько конкретных примеров в Rx действительно хорошо отображается на
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