首页 > 解决方案 > 等待操作符,执行直到任务返回

问题描述

假设,我们有代码来计算一个数字的阶乘。

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) 时,它将启动任务并等待 Task 返回以分析它。因此,直到代码到达FactorialAsync(n)内部的行: return Task.FromResult(result)它将同步执行。我对么??

标签: c#.netasynchronous

解决方案


你是对的。您可能对做什么有不正确的理解awaitAwait 不会使方法异步。Await异步等待异步方法的结果。 该方法必须已经是异步的。

如果调用返回任务的同步方法,则同步方法会一直运行,直到它返回任务。这是正常的和预期的。

换句话说:异步方法一直运行到第await一个未完成的任务,此时它返回一个任务。 您的方法没有 awaits。因此它不是异步的。您所做的只是将答案打包到一个任务中,然后将其提取出来。如果您希望代码是异步的,您必须实际做一些事情来使其异步。


推荐阅读