Главное различие между и Observable
заключается в том, как они обрабатывают состояние и не подписываются.
Event функции прикрепить к событию источника и не дают никакого способа отказаться от подписки. Если вы используете комбинаторы с состоянием (например, Event.scan
), а затем присоедините несколько наблюдателей к результирующему событию, тогда все они будут видеть одно и то же состояние.
Наблюдаемые функции строят «спецификацию» технологического трубопровода. Когда вы прикрепляете обработчик к значению IObservable
, вы возвращаете IDisposable
, который можно использовать для удаления всех обработчиков. Каждый обработчик, присоединенный к IObservable
, получит новое состояние (поскольку среда выполнения создает новую цепочку обработки в соответствии со «спецификацией»).
На практике основное отличие заключается в statfullness - если вы хотите поделиться состояние, вы можете использовать модуль Event
- реализация того же с помощью Observable
возможно, но сложнее.
Если вы используете события внутри async
, то вы должны использовать Observable
и AwaitObservable
(вместо встроенной AwaitEvent
), потому что с помощью комбинатора событий будет утечка памяти - он присоединит обработчики событий, которые никогда не удаляются.
Вначале разница не очевидна, а событие (E) полностью перегружено. – nicolas
@Nicolas Это правда. Это связано с историческими причинами (у F # был модуль «Event» до того, как существовал «IObservable»), и, возможно, правильное решение было удалить его). Но, честно говоря, было бы проще, если бы в .NET не было особых «событий», но это было решено слишком давно :-). –