两级异步等待调用
本文关键字:异步 等待 调用 两级 | 更新日期: 2023-09-27 18:32:15
最近我遇到了一些带有async-await的异步代码。我的问题是下面的两个代码块有什么区别 -
代码块 - 1
public async Task Method1(string fileName)
{
await Method2(fileName);
}
public async Task Method2(string filePath)
{
await Task.Run(() =>{
//do some task
});
}
代码块 - 2
public async Task Method1(string fileName)
{
await Method2(fileName);
}
public async Task Method2(string filePath)
{
Task.Run(() =>{
//do some task
});
}
这两个代码之间的差异在方法2上等待。当第三个方法(例如方法3)调用方法1时会发生什么?从方法 3 观察到的执行有何不同?
Method2
存在严重问题:
public async Task Method2(string filePath)
{
Task.Run(() =>{
//do some task
});
}
它同步运行并返回一个完整的Task
对象(Task.IsComplete == true
)。但是,在返回之前,它会启动另一个任务(使用 Task.Run
),该任务异步运行并且完成状态结果丢失("触发并忘记")。这样说会更有意义:
public Task Method2(string filePath)
{
return Task.Run(() =>{
//do some task
});
}
在第二个代码块中,Method2 将完成,而无需等待 Task.Run in Method2 完成。
这取决于您在实施方面的需求。例如,如果要初始化 Method2 中的变量,并且被调用方希望初始化此变量,则第二个代码块将导致意外错误。