web-dev-qa-db-fra.com

Comment obtenir une valeur de retour de Task.WaitAll () dans une application console?

J'utilise une application console comme preuve de concept et nouveau besoin d'obtenir une valeur de retour asynchrone.

J'ai compris que je devais utiliser Task.WaitAll() dans ma méthode principale pour éviter d'avoir besoin d'une méthode async "main ()", ce qui est illégal.

Je suis maintenant coincé à essayer de trouver une surcharge qui me permet d'utiliser des génériques ou renvoie simplement un objet que je peux lancer, mais dans Main ().

35
goodguys_activate

Vous n'obtenez pas de valeur de retour de Task.WaitAll. Vous ne l'utilisez que pour attendre la fin de plusieurs tâches, puis obtenir la valeur de retour des tâches elles-mêmes.

var task1 = GetAsync(1);
var task2 = GetAsync(2);
Task.WaitAll(task1, task2);
var result1 = task1.Result;
var result2 = task2.Result;

Si vous n'avez qu'un seul Task, utilisez simplement la propriété Result. Il renverra votre valeur et bloquera le thread appelant si la tâche n'est pas encore terminée:

var task = GetAsync(3);
var result = task.Result;

Ce n'est généralement pas une bonne idée d'attendre (bloquer) de manière synchrone une tâche asynchrone ("synchronisation sur async"), mais je suppose que c'est bien pour un POC.

61
i3arnon

Pour une meilleure pratique, utilisez la nouvelle façon asynchrone de faire les choses. Au lieu de

  • Task.WaitAll utilisation await Task.WhenAll
  • Task.WaitAny utilisation await Task.WhenAny

Le code ci-dessus peut s'écrire:

var task1 = GetAsync(1);
var task2 = GetAsync(2);
var results = await Task.WhenAll(task1, task2);
var result1 = results[0];
var result2 = results[1];
29
alltej