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 ().
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.
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];