Der Hauptunterschied zwischen Event
und Observable
ist in, wie sie Zustand und Nicht-Abonnement behandeln.
Ereignis Funktionen an die Quelle Ereignis zuordnen und geben Sie keine Möglichkeit, sich abzumelden. Wenn Sie statusbehaftete Kombinatoren verwenden (wie Event.scan
) und dann mehrere Beobachter an das resultierende Ereignis anhängen, werden alle denselben Zustand sehen.
Observable Funktionen Konstrukt "Spezifikation" der Verarbeitung Pipeline. Wenn Sie einen Handler an den Wert IObservable
anfügen, erhalten Sie eine IDisposable
zurück, die zum Entfernen aller Handler verwendet werden kann. Jeder Handler, der an IObservable
angehängt ist, erhält einen neuen Status (weil die Laufzeitumgebung eine neue Verarbeitungskette gemäß der "Spezifikation" erstellt).
In der Praxis ist der Hauptunterschied in der statfullness - wenn Sie Staat teilen möchten, können Sie das Event
Modul verwenden - Implementierung der Verwendung derselben Observable
möglich ist, aber härter.
Wenn Sie Ereignisse innerhalb async
verwenden, dann sollten Sie verwenden Observable
und AwaitObservable
(statt der eingebauten in AwaitEvent
), weil Ereignis combinators verwendet, wird ein Speicherleck - es Event-Handler anhängen wird, die niemals entfernt werden.
Der Unterschied ist zunächst nicht offensichtlich, und das Wort (E) -Ereignis ist ziemlich überlastet. – nicolas
@Nicolas Das stimmt. Es folgt aus historischen Gründen (F # hatte 'Event'-Modul, bevor' IObservable' existierte - und vielleicht war das richtige, es zu entfernen). Aber um ehrlich zu sein, die Dinge wären einfacher, wenn .NET überhaupt keine speziellen "Events" hätte, aber das ist schon vor langer Zeit entschieden :-). –