62 votes

ne peut pas attendre lambda async

Considère ceci,

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

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

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

then (mis à jour en fonction du commentaire de svick)

 await AwaitableMethod(); 
 

82voto

Joe Daley Points 9352

Dans votre exemple lambda, lorsque vous appelez task.Wait() , vous attendez la nouvelle tâche que vous avez créée, et non la tâche différée renvoyée. Pour obtenir le délai souhaité, vous devez également attendre la tâche résultante:

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

Vous pouvez éviter de construire une nouvelle tâche et n’avoir qu’une tâche à traiter au lieu de deux:

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

6voto

Vous devez utiliser TaskEx.RunEx.

Il prend nativement en charge exécutant async méthodes TaskPool par l'attente de l'intérieur de la tâche en interne. Sinon, vous rencontrerez le problème auquel vous êtes confronté, où seul l'extérieur de la tâche est attendu, qui, évidemment, se termine immédiatement, laissant une tâche qui doit encore en attente, ou dans votre cas (et même pire) un vide lambda qui ne peut pas être attendu.

Sinon, vous pouvez attendre la tâche deux fois, vous permettant de construire votre extérieur tâche correctement (ce qui actuellement vous n'êtes pas).

Code actuel (fixe):

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

task.Start();
var innerTask = await task;
await innerTask;

À L'Aide De TaskEx.RunEx:

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

await task;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X