c# - 异步方法不将控制权返回给调用方方法
问题描述
我有以下代码
class Program
{
public async Task<bool> StartMyTask()
{
await Foo();
return true;
}
public async Task<bool> Foo()
{
for (int i = 0; i < 1000000; i++)
{
Console.WriteLine("Loop");
}
return true;
}
static void Main(string[] args)
{
Program obj = new Program();
var myTask = obj.StartMyTask();
Console.WriteLine("Before Task Return");
Console.ReadLine();
}
}
根据我的理解,当调用“await Foo()”时,将创建一个线程来执行“Foo()”方法,并将控制权返回给调用者(Main 方法)。
考虑到这一点,应该在“Foo()”方法完成之前打印“Before Task Return”。但它没有发生,首先“Foo()”方法完成,然后显示“任务返回之前”。
解决方案
根据我的理解,当调用“await Foo()”时,将创建一个线程来执行“Foo()”方法,并将控制权返回给调用者(Main 方法)。
不,绝对不是。async
并且await
不要自己创建线程。async
允许您使用await
,await
并将“异步等待” - 即暂停方法,返回,然后在其操作完成时恢复该方法。
请注意,编译器会警告您已标记了一个方法,async
但它将同步运行。所以编译器已经准确地告诉你出了什么问题。
如果要使用后台线程,可以使用Task.Run
调用同步Foo
方法:
public async Task<bool> StartMyTask()
{
await Task.Run(() => Foo());
return true;
}
public bool Foo()
{
for (int i = 0; i < 1000000; i++)
{
Console.WriteLine("Loop");
}
return true;
}
推荐阅读
- powershell - 两个 AD 域控制器之间的桥接机器
- python - 有什么方法可以在 matplotlib 中正确制作每周时间序列折线图?
- mysql - 在 Azure Key Vault 中存储 MySQL Enterprise 加密密钥
- php - 在 div 中调用 php 函数
- amazon-web-services - 发布时 AWS lambda 回滚
- c# - Apache Ignite,C#/.NET:BinaryObject 警告 - Execpted 和 Actual ValueType 不相等,无法查询条目
- qt - Qt动态改变bg颜色而不覆盖其他样式
- python - 线性同余生成器的二维图
- mongodb - Mongo DB项目将一个数组元素转换成单个数组
- java - 如何连续获得一定数量的字符?