asynchronous multitasking async-await c#-5.0

asynchronous - múltiples llamadas asincrónicas paralelas con aguardar



multitasking async-await (3)

El Async CTP ya no es necesario, siempre que esté utilizando .NET 4.5. Tenga en cuenta que la funcionalidad asincrónica está implementada por el compilador, por lo que las aplicaciones .NET 4 pueden usarla, pero se necesita VS2012 para compilarla.

TaskEx ya no es necesario. El CTP no pudo modificar el marco existente, por lo que utilizó extensiones para lograr cosas que el lenguaje manejaría en 5.0. Solo usa Tarea directamente.

Por lo tanto, he vuelto a escribir el código (respondido por Stephen Cleary) al reemplazar TaskEx por Tarea.

var taskA = someCall(); // Note: no await var taskB = anotherCall(); // Note: no await // Wait for both tasks to complete. await Task.WhenAll(taskA, taskB); // Retrieve the results. var resultA = taskA.Result; var resultB = taskB.Result;

Hasta donde sé, cuando el tiempo de ejecución se encuentra con la siguiente declaración, envuelve el resto de la función como una devolución de llamada al método que se invoca asincrónicamente (someCall () en este ejemplo). en este caso anotherCall () se ejecutará como una devolución de llamada a someCall ():

await someCall(); await anotherCall();

Me pregunto si es posible hacer que el tiempo de ejecución funcione de la siguiente manera: llame a someCall () en modo asíncrono y devuelva inmidatelly al hilo de llamada, luego invoque anotherCall () de manera similar (sin esperar que se complete alguna llamada). porque necesito que estos 2 métodos se ejecuten de forma asincrónica y supongo que estas llamadas son solo llamadas de disparo y olvido.

Entonces, ¿es posible implementar este escenario usando solo asincronización y aguardar (sin usar el antiguo mecanismo de inicio / finalización)?


El async / await incluye algunos operadores para ayudar con la composición paralela, como WhenAll y WhenAny .

var taskA = someCall(); // Note: no await var taskB = anotherCall(); // Note: no await // Wait for both tasks to complete. await Task.WhenAll(taskA, taskB); // Retrieve the results. var resultA = taskA.Result; var resultB = taskB.Result;


La forma más simple es probablemente hacer esto:

var taskA = someCall(); var taskB = someOtherCall(); await taskA; await taskB;

Esto es especialmente bueno si quiere los valores de resultado:

var result = await taskA + await taskB;

por lo que no es necesario hacer una taskA.Result . taskA.Result .

TaskEx.WhenAll puede ser más rápido que dos espera uno detrás del otro. No sé, ya que no he hecho una investigación de rendimiento sobre eso, pero a menos que veas un problema, creo que las dos esperanzas consecutivas son mejores, especialmente si tienes los valores de los resultados.