最近我遇到了一些使用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中观察到的执行有何不同?
答案 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期望初始化此变量,则第二个代码块将导致意外错误。