2012-10-03 13 views

risposta

27

Sono diversi. La differenza principale è che C# utilizza standard .NET Task<T> per rappresentare calcoli asincroni mentre F # utilizza il proprio tipo chiamato Async<T>.

Più in particolare, le differenze principali sono:

  • AC metodo # asincrono crea un Task<T> che viene subito iniziato (caldo compito modello), mentre F # crea un calcolo che è necessario avviare in modo esplicito (generatore modello). Ciò significa che le computazioni F # sono più facili da comporre (puoi scrivere astrazioni di livello superiore).

  • In F # si ottiene anche un controllo migliore su come è iniziata la computazione. Puoi iniziare un calcolo utilizzando Async.Start per avviarlo in background o Async.StartImmediate per avviarlo sul thread corrente.

  • F flussi di lavoro # asincroni sostenere cancellazione automaticamente, in modo da non dover passare CancellationToken intorno.

  • Forse un'altra conseguenza del primo punto è che F flussi di lavoro # asincrone supportano anche la coda-ricorsione, in modo da poter scrivere i flussi di lavoro ricorsive (questo non sarebbe lavorare facilmente in C#, ma C# non usare questo stile di programmazione)

ho scritto un articolo più dettagliato su questo argomento: Asynchronous C# and F# (II.): How do they differ?

+1

Grazie mille! Ma come vengono utilizzati i fili sotto il cofano? Don Syme sottolinea nel suo libro 'Expert F #' che F # usa il thread hopping. È lo stesso per C# o ci sono alcune differenze? – Andries

+8

In F #, quando si avvia su un thread con specifico 'SynchronizationContext' (cioè il thread GUI), il calcolo asincrono ritorna a questo' SynchronizationContext'. Non sono riuscito a trovare una documentazione che dicesse come questo si comporta in C#, ma i miei esperimenti dimostrano che si comporta allo stesso modo - cioè, se si avvia 'await'ing su un thread GUI, il resto del calcolo verrà eseguito sul thread GUI (anche se la computaiton che stai aspettando esegue la continuazione su un altro thread). –

+1

@TomasPetricek Ancora una volta - ottime informazioni su F #. –