0

最近我遇到了一些带有 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
    });
}

这两个代码的区别在于 Method2 上的 await。当第三种方法(比如 Method3)调用 Method1 时会发生什么?从 Method3 观察到的执行有什么不同?

4

2 回答 2

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
    });
}
于 2013-09-22T13:52:29.547 回答
2

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

这取决于您在实施方面需要什么。例如,如果你想在 Method2 中初始化一个变量,而被调用者希望这个变量被初始化,那么第二个代码块将导致意外错误。

于 2013-09-22T13:12:25.747 回答