2013-03-21 5 views
19

Это эквивалентно/лучше работатьсобытий и Наблюдаемые в FSharp

Функционально это кажется эквивалент, и я думаю, что различие является «семантическим»:

  • Мы находимся внутри границы, где имеет смысл иметь доступ ко внутреннему состоянию события?
  • Или мы рассматривая это event interface как пассивный источник, из которого поток был выставлен нам

ли, что правильное мышление?

ответ

22

Главное различие между и Observable заключается в том, как они обрабатывают состояние и не подписываются.

  • Event функции прикрепить к событию источника и не дают никакого способа отказаться от подписки. Если вы используете комбинаторы с состоянием (например, Event.scan), а затем присоедините несколько наблюдателей к результирующему событию, тогда все они будут видеть одно и то же состояние.

  • Наблюдаемые функции строят «спецификацию» технологического трубопровода. Когда вы прикрепляете обработчик к значению IObservable, вы возвращаете IDisposable, который можно использовать для удаления всех обработчиков. Каждый обработчик, присоединенный к IObservable, получит новое состояние (поскольку среда выполнения создает новую цепочку обработки в соответствии со «спецификацией»).

На практике основное отличие заключается в statfullness - если вы хотите поделиться состояние, вы можете использовать модуль Event - реализация того же с помощью Observable возможно, но сложнее.

Если вы используете события внутри async, то вы должны использовать Observable и AwaitObservable (вместо встроенной AwaitEvent), потому что с помощью комбинатора событий будет утечка памяти - он присоединит обработчики событий, которые никогда не удаляются.

+0

Вначале разница не очевидна, а событие (E) полностью перегружено. – nicolas

+7

@Nicolas Это правда. Это связано с историческими причинами (у F # был модуль «Event» до того, как существовал «IObservable»), и, возможно, правильное решение было удалить его). Но, честно говоря, было бы проще, если бы в .NET не было особых «событий», но это было решено слишком давно :-). –