2013-03-21 16 views
19

E 'equivalente/meglio per lavorareeventi e osservabili in FSharp

Funzionalmente sembra equivalente, e immagino che la differenza sia "semantica":

  • Siamo all'interno del confine in cui ha senso avere accesso allo stato interno di l'evento?
  • O stiamo considerando questo event interface come fonte passiva da cui un flusso è stato esposto a noi

è che il pensiero corretto?

risposta

22

La differenza principale tra Event e Observable riguarda il modo in cui gestiscono lo stato e l'annullamento della sottoscrizione.

  • Evento funzioni attribuiscono alla manifestazione di origine e non ti danno alcun modo per annullare l'iscrizione. Se si utilizzano combinatori stateful (come Event.scan) e quindi si associano più osservatori all'evento risultante, allora tutti vedranno lo stesso stato.

  • Le funzioni osservabili costruiscono "specifiche" della pipeline di elaborazione. Quando si allega un gestore al valore IObservable, si ottiene un IDisposable che può essere utilizzato per rimuovere tutti i gestori. Ogni gestore collegato a IObservable riceverà un nuovo stato (poiché il runtime crea una nuova catena di elaborazione in base alla "specifica").

In pratica, la differenza principale è nella statfullness - se si desidera condividere lo stato, è possibile utilizzare il modulo Event - attuando la stessa utilizzando Observable è possibile ma difficile.

Se stai usando gli eventi all'interno async, quindi si dovrebbe utilizzare Observable e AwaitObservable (invece di built-in AwaitEvent), perché l'utilizzo di combinatori evento sarà una perdita di memoria - che attribuirà i gestori di eventi che non vengono mai rimossi.

+0

La differenza è lungi dall'essere ovvia in un primo momento, e l'evento di parola (E) è piuttosto sovraccarico. – nicolas

+7

@Nicolas È vero. Ne consegue da ragioni storiche (F # aveva il modulo 'Event' prima che esistesse' IObservable' - e forse la cosa giusta era rimuoverlo). Ma, ad essere onesti, le cose sarebbero più facili se .NET non avesse "eventi" speciali in primo luogo, ma ciò è stato deciso troppo tempo fa :-). –