Пример кода, иллюстрирующий разницу между парадигмами расширения async/wait и Reactive (Rx)?

Обе системы Реактивное расширение для .NET и новый С# 5.0 (.NET 4.5) async/await продолжить (или на основе) будущее и promises конструирует парадигму (подход).

Можете ли вы дать (*) простейший пример кода на С#, иллюстрирующий разницу между ними?

(*)
Возможно ли это без соединений ввода-вывода, Интернета или базы данных?

Update:
Ну, позвольте мне переформулировать, если бы этот вопрос, казалось, был дан ответ раньше.
Почему бы добавить и начать использовать Reactive (Rx) расширения для .NET при использовании собственного .NET Iobservable/IObserver + ждать/асинхронно?

Каковы возможные иллюстрации того, чего не хватает в Rx, чтобы сделать то же самое более неуклюже или менее эффективно без Rx (т.е. задействовать только собственный подход .NET Iobservable/IObserver + await/async)?

Ответ 1

Парадигма Future/Promise обычно используется для возврата одного значения в будущем. Возможно, есть какой-то тяжелый расчет или IO, что требуется, и, следовательно, почему не может быть гарантировано возвращение синхронно своевременно.

Rx (и по прокси-интерфейсу IObserver<T>/IObservable<T>) является парадигмой наблюдаемых последовательностей. Так же, как синхронный метод может вернуть одно значение (int), он также может вернуть IEnumerable<int> с одним значением. Сравнивая это с асинхронным миром, Task<int> может возвращать одно значение int, IObservable<int> может возвращать последовательность только с одним значением int.

Итак, если вы хотите вернуть последовательность значений с помощью Task<T>, вам придется либо создать какое-то продолжение, либо вернуть набор/массив/список значений в качестве T например. Task<int[]>. Это, однако, означает, что вы получаете все или не значения.

Task/Task<T> также является конкретным типом, где Rx использует интерфейсы для абстрагирования вас от реализации. Я нашел это, чтобы помочь в модульном тестировании. TaskCompletionSource<T> однако может быть полезно избежать неявного concurrency при тестировании с задачами.

Наконец, помимо основного различия в том, что Rx имеет дело с последовательностями значений (не одиночными значениями), Rx также предназначен для работы с LINQ для предоставления запросов и композиционных преимуществ, которые, как представляется, очень хорошо работают с последовательностями (либо в состоянии покоя например, IEnumerable<T> или в движении, как IObservable<T>).

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

Ответ 2

Они не являются взаимоисключающими. Основное определение заключается в том, есть ли у вас один результат в будущем или несколько будущих результатов.

http://blogs.msdn.com/b/rxteam/archive/2012/03/12/reactive-extensions-v2-0-beta-available-now.aspx

http://blogs.msdn.com/cfs-filesystemfile.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-31-75-metablogapi/0815.image_5F00_thumb_5F00_59BBA077.png

Ответ 3

Мне нравится таблица в документации Reactive: http://reactivex.io/intro.html

У меня есть собственное занятие, где я добавляю третье измерение, не входящее в состав/составное.

Non-компонуемы:

  • Единый элемент/синхронный: функция
  • Несколько элементов/синхронный: итеративный
  • Отдельный элемент/асинхронный: функция async
  • Несколько элементов/асинхронный: наблюдаемый

наборный:

  • Единый элемент/синхронный: функция более высокого порядка
  • Несколько элементов/синхронно: linq/ramda/java.util.stream
  • Отдельный элемент/асинхронный: будущее/обещание
  • Несколько элементов/асинхронный: rx observable

И помните, что в зависимости от реализации вы можете иметь фьючерсы и rx-наблюдаемые, которые могут действовать синхронно или асинхронно в зависимости от того, что вы пытаетесь сделать с ними: синхронно или асинхронно