2013-03-21 16 views
19

Ist es gleichwertig/besserEreignis und beobachtbare in FSharp

zu arbeiten

Funktionell scheint es gleichwertig, und ich denke, der Unterschied ist "semantisch":

  • Sind wir innerhalb der Grenze, wo es sinnvoll ist, Zugang zum internen Zustand der Veranstaltung zu haben?
  • Oder betrachten wir diese event interface als passive Quelle, aus der ein Strom

Ist das das richtige Denken zu uns ausgesetzt war?

Antwort

22

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.

+0

Der Unterschied ist zunächst nicht offensichtlich, und das Wort (E) -Ereignis ist ziemlich überlastet. – nicolas

+7

@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 :-). –