Ожидание оператора, выполнение до тех пор, пока задание не будет возвращено - PullRequest
0 голосов
/ 06 декабря 2018

Предположим, у нас есть код для вычисления факториала числа.

public Task<long> FactorialAsync(int n) 
{
     long result = 1;
     for (int i = 1; i <= n; ++i)
          result *= i;
     return Task.FromResult(result);
}

и некоторый код, который использует FactorialAsync ()

public async Task CalculateFactorial(int n)
{
    long result = await FactorialAsync(n);
    Console.WriteLine(result);
}

Что беспокоитя в том, что когда код достигает await FactorialAsync (n), он запускает задачу и будет ждать до тех пор, пока задача не будет возвращена для ее анализа.Поэтому до тех пор, пока код не достигнет строки FactorialAsync (n) до строки: вернет Task.FromResult (result) , он будет выполняться синхронно.Я прав?

1 Ответ

0 голосов
/ 06 декабря 2018

Вы правы.Возможно, вы неправильно понимаете, что делает await. Await не делает метод асинхронным .Await асинхронно ожидает результата асинхронного метода. Метод должен быть уже асинхронным.

Если вы вызываете синхронный метод, который возвращает задачу, то синхронный метод выполняется до тех пор, пока не вернет задачу.Это нормально и ожидаемо.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...