ne peut pas attendre async lambda

Considère ceci,

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

L’appel task.Wait () n’attend pas la fin de la tâche et la ligne suivante est exécutée immédiatement, mais si j’emballe l’expression lambda async dans un appel de méthode, le code fonctionne comme prévu.

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

puis (mis à jour selon le commentaire de svick)

 await AwaitableMethod(); 

Dans votre exemple lambda, lorsque vous appelez task.Wait() , vous attendez la nouvelle tâche que vous avez task.Wait() , pas la tâche de délai task.Wait() . Pour obtenir le délai souhaité, vous devez également attendre la tâche suivante:

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

Vous pouvez éviter de créer une nouvelle tâche et vous n’avez qu’une seule tâche à traiter au lieu de deux:

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

Vous devez utiliser TaskEx.RunEx .

Il prend en charge nativement l’exécution de méthodes async sur le TaskPool en attendant la tâche interne en interne. Sinon, vous rencontrerez le problème auquel vous êtes confronté, où seule la tâche externe est attendue, ce qui se termine évidemment immédiatement, en laissant soit une tâche à attendre, soit dans votre cas (et même pire) un lambda vide qui ne peut pas être attendu.

Alternativement, vous pouvez attendre la tâche deux fois, à condition que vous construisiez correctement votre tâche externe (ce que vous n’êtes pas actuellement).

Code actuel (fixe):

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

En utilisant TaskEx.RunEx:

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