Как достать значение из async Task

325
26 июня 2017, 17:19

Есть вот такой код. Вопрос: как в Main достать значение heart из ExampleTask()?

namespace ConsoleApplication19
{
 class Program
   {
       static void Main(string[] args)
       {
       }
   }
 class Example
   {
       public async Task<string> ExampleTask()
       {
           UrbanService client = new UrbanService();
           var data = await client.Data("Mom");
           var heart = data.List[0].Definition;
           return heart;
       }
   }
}
Answer 1

Вы можете использовать оператор await для того чтобы дождавшись окончания асинхронной операции, получить возвращаемое ею значение.

string hart = await example.ExampleTask();

Имейте в виду, однако, три вещи.

  1. Для того, чтобы было возможно использовать оператор await, при объявлении метода необходимо использовать оператор async.

private async void MyMethod {

  1. Весь код, который идет после строчки с оператором await выполняется асинхронно. То есть, выполнение метода MyMethod закончится на той строчке, на которой стоит оператор await, и управление будет передано в метод его вызывающий. Код, который вы напишете после оператора await, и который будет использовать переменную hart, выполнится только тогда, когда Task завершится.

  2. Если метод Main не будет ожидать окончания задачи, то приложение завершится. В этом случае код после await может никогда не выполнится. Чтобы этого избежать, необходимо каким-то образом остановить выполнение метода Main. В этом случае, вам не подойдет решение с использованием оператора await. Придется дождаться окончания выполнения Task с помощью метода Wait.

Task<string> task = example.ExampleTask(); task.Wait(); string hart = task.Result;

  • Второй нюанс зачастую не приводит к проблемам, но все равно о нем следует помнить. И если ваш код как-то не так работает, попробуйте проанализировать как он будет выполняться учитывая этот второй нюанс. Скорее всего, после этого сразу станет понятно как исправить код.

  • Третий нюанс не возник бы в приложении, в котором запущен UI поток (WinForms, WPF), потому что такие приложения продолжают функционировать даже после того, как ваш код прекратил выполняться.

READ ALSO
Как подключиться к MySQL БД на хостинге?

Как подключиться к MySQL БД на хостинге?

Доброго дня! Недавно начал изучать программированиеНачал с Unity3d использую C#

443
Настройка Chart в WPFToolkit

Настройка Chart в WPFToolkit

Доброго всем времени суток!

241
Кратчайший путь в графе, алгоритм Форда-Беллмана

Кратчайший путь в графе, алгоритм Форда-Беллмана

В чём может быть ошибка? Не считает кратчайший путь, как надо

372