c# - 等待操作符,执行直到任务返回
问题描述
假设,我们有代码来计算一个数字的阶乘。
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)它将同步执行。我对么??
解决方案
你是对的。您可能对做什么有不正确的理解await
。Await 不会使方法异步。Await异步等待异步方法的结果。 该方法必须已经是异步的。
如果调用返回任务的同步方法,则同步方法会一直运行,直到它返回任务。这是正常的和预期的。
换句话说:异步方法一直运行到第await
一个未完成的任务,此时它返回一个任务。 您的方法没有 awaits。因此它不是异步的。您所做的只是将答案打包到一个任务中,然后将其提取出来。如果您希望代码是异步的,您必须实际做一些事情来使其异步。
推荐阅读
- c# - 无法使用 insertOneAsync 在 mongodb 中插入数据
- makefile - 为什么在使用隐式规则时 make 不使用我的显式规则?
- python-3.x - 两种异常处理的区别
- python - 嘿伙计们,我在这段代码中做错了什么。我正在尝试将 13195 的所有主要因素附加到一个空列表中,但它给了我一个空列表
- apache-spark - Spark:加入时的奇怪分区
- python-3.x - 如何同时打开使用 2 个不同的可视化工具包(VTK 和 tkinter)构建的 2 个不同的 GUI?
- events - 如何收听 Skype for Business 通话事件
- java - 检查字符串中的数字,当字符串以 0 开头时不起作用
- android - 为什么要从android中的相机捕获模糊图像?
- couchbase - Couchbase:如何使用文档 ID 模式删除多个文档