Подтвердить что ты не робот

Как получить возвращаемое значение из Task.WaitAll() в консольном приложении?

Я использую консольное приложение как доказательство концепции и новую потребность получить возвращаемое значение async.

Я понял, что мне нужно использовать Task.WaitAll() в моем основном методе, чтобы избежать необходимости использования метода async "main()", что является незаконным.

Я сейчас застреваю, пытаясь понять перегрузку, которая позволяет мне использовать дженерики или просто возвращает объект, который я могу использовать, но пока в Main().

4b9b3361

Ответ 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];