两级异步等待调用

本文关键字:异步 等待 调用 两级 | 更新日期: 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 中的变量,并且被调用方希望初始化此变量,则第二个代码块将导致意外错误。