Как получить возвращаемое значение из Task.WaitAll() в консольном приложении?
Я использую консольное приложение как доказательство концепции и новую потребность получить возвращаемое значение async.
Я понял, что мне нужно использовать Task.WaitAll()
в моем основном методе, чтобы избежать необходимости использования метода async "main()", что является незаконным.
Я сейчас застреваю, пытаясь понять перегрузку, которая позволяет мне использовать дженерики или просто возвращает объект, который я могу использовать, но пока в Main().
Ответы
Ответ 1
Вы не получите возвращаемое значение из Task.WaitAll
. Вы используете его только для того, чтобы дождаться завершения нескольких задач, а затем получить возвращаемое значение из самих задач.
var task1 = GetAsync(1);
var task2 = GetAsync(2);
Task.WaitAll(task1, task2);
var result1 = task1.Result;
var result2 = task2.Result;
Если у вас есть только один Task
, просто используйте свойство Result
. Он вернет ваше значение и заблокирует вызывающий поток, если задача еще не закончена:
var task = GetAsync(3);
var result = task.Result;
Обычно не рекомендуется синхронно ждать (блокировать) по асинхронной задаче ( "sync over async" ), но я думаю, что это нормально для POC.
Ответ 2
Для лучшей практики используйте новый асинхронный способ делать что-то.
Вместо
-
Task.WaitAll
использовать await Task.WhenAll
-
Task.WaitAny
использовать await Task.WhenAny
Вышеприведенный код может быть записан как:
var task1 = GetAsync(1);
var task2 = GetAsync(2);
var results = await Task.WhenAll(task1, task2);
var result1 = results[0];
var result2 = results[1];