两级异步 - 等待调用

时间:2013-09-22 13:08:28

标签: c# async-await

最近我遇到了一些使用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。当第三种方法(比如Method3)调用Method1时会发生什么?从Method3中观察到的执行有何不同?

2 个答案:

答案 0 :(得分: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
    });
}

答案 1 :(得分:2)

在第二个代码块中,Method2将完成,无需等待Method2中的Task.Run完成。

这取决于您在实施方面的需求。例如,如果要在Method2中初始化变量,并且callee期望初始化此变量,则第二个代码块将导致意外错误。