2012-10-03 24 views

Respuesta

27

Son diferentes. La diferencia principal es que C# usa el estándar .NET Task<T> para representar cálculos asincrónicos mientras que F # usa su propio tipo llamado Async<T>.

Más específicamente, las principales diferencias son: Método # asíncrono

  • CA crea un Task<T> que se inicia inmediatamente (caliente modelo de tarea), mientras que F # crea un cálculo que hay que empezar de forma explícita (generador modelo). Esto significa que los cómputos de F # son más fáciles de componer (puede escribir abstracciones de mayor nivel).

  • En F # también obtiene un mejor control sobre cómo se inició el cálculo. Puede iniciar un cálculo usando Async.Start para iniciarlo en segundo plano o Async.StartImmediate para iniciarlo en el hilo actual.

  • F flujos de trabajo # asíncronos apoyar cancelación automáticamente, así que no tienen que pasar CancellationToken alrededor.

  • Tal vez otra consecuencia del primer punto es que F flujos de trabajo # asincrónicos también apoyan la cola-recursividad, para que pueda escribir los flujos de trabajo recursivas (esto no funcionaría fácilmente en C#, pero C# no utilizar este estilo de programación)

escribí un artículo más detallado sobre este tema: Asynchronous C# and F# (II.): How do they differ?

+1

Muchas gracias! Pero, ¿cómo se usan los hilos debajo del capó? Don Syme señala en su libro 'Expert F #' que F # usa el salto de hilo. ¿Es esto lo mismo para C# o hay algunas diferencias? – Andries

+8

En F #, cuando comienza en un subproceso con 'SynchronizationContext' específico (es decir, el subproceso de la GUI), el cálculo asincrónico salta de nuevo a este' SynchronizationContext'. No pude encontrar una documentación que diga cómo se comporta esto en C#, pero mis experimentos muestran que se comporta de la misma manera, es decir, si comienzas a 'esperar' en un hilo de la GUI, entonces el resto de tu computación se ejecutará en el hilo GUI (incluso si la computación que está esperando ejecuta la continuación en otro hilo). –

+1

@TomasPetricek Una vez más, excelente información sobre F #. –

Cuestiones relacionadas