what operador method example create await async c# task-parallel-library async-await async-ctp

method - operador await c#



no puede esperar async lambda (2)

En su ejemplo de lambda, cuando llama a task.Wait() , está esperando la nueva tarea que construyó, no la Tarea de retraso que devuelve. Para obtener el retraso deseado, también deberá esperar en la Tarea resultante:

Task<Task> task = new Task<Task>(async () => { await Task.Delay(1000); }); task.Start(); task.Wait(); task.Result.Wait();

Podrías evitar construir una nueva Tarea, y solo tienes que lidiar con una Tarea en lugar de dos:

Func<Task> task = async () => { await TaskEx.Delay(1000); }; task().Wait();

Considera esto,

Task task = new Task (async () =>{ await TaskEx.Delay(1000); }); task.Start(); task.Wait();

La llamada task.Wait () no espera la finalización de la tarea y la siguiente línea se ejecuta inmediatamente, pero si envuelvo la expresión async lambda en una llamada a método, el código funciona como se esperaba.

private static async Task AwaitableMethod() { await TaskEx.Delay(1000); }

luego (actualizado según el comentario de svick)

await AwaitableMethod();


Necesita usar TaskEx.RunEx .

Admite de forma nativa la ejecución de métodos async en TaskPool al esperar internamente la tarea interna. De lo contrario, se encontrará con el problema al que se enfrenta, donde solo se espera la tarea externa, que obviamente se completa inmediatamente, dejando una tarea que todavía necesita esperar, o en su caso (y aún peor) una lambda vacía que no puede ser esperado

Alternativamente, puede esperar la tarea dos veces, siempre que construya su tarea externa correctamente (que actualmente no es).

Código actual (fijo):

Task task = new Task<Task>(async () =>{ await TaskEx.Delay(1000); }); task.Start(); var innerTask = await task; await innerTask;

Usando TaskEx.RunEx:

Task task = TaskEx.RunEx(async () =>{ // Framework awaits your lambda internally. await TaskEx.Delay(1000); }); await task;