Подтвердить что ты не робот

Событие и наблюдаемое в FSharp

Это эквивалентно/лучше работать

Функционально это кажется эквивалентным, и я предполагаю, что разница является "семантической":

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

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

4b9b3361

Ответ 1

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

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

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

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

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