异步/等待执行差异

时间:2014-04-20 10:17:04

标签: c# asynchronous async-await

我试图很好地掌握异步/等待,我想澄清一些混乱。有人可以解释下列执行方面的差异:

// version 1
public Task Copy(string source, string destination) {
    return Task.Run(() => File.Copy(source, destination));
}

public async Task Test() {
    await Copy("test", "test2");    
    // do other stuff
}

// version 2
public async Task Copy(string source, string destination) {
    await Task.Run(() => File.Copy(source, destination));
}

public async Task Test() {
    await Copy("test", "test2");
    // ...
}

它们是否会产生相同的代码,为什么我会将其中一个写在另一个上?

1 个答案:

答案 0 :(得分:8)

首先让我先谈谈两个代码相同。

你的version1代码只会创建一个"状态机"因为它只包含等待Test方法。

你的version2代码将创建两个"状态机" CopyTest方法会增加一些开销。

为什么我们使用async方法?简单只是为了使我们的代码可读,优雅,同时处理"异步任务"。它使我们的代码更好地避免了回调和延续等。

  

让我们分解Copy方法正在做什么,然后我们回答   质疑我们是否真的需要它async

Copy方法只是将调用委托给Task.Run,该File.Copy会返回一个任务,该任务最终会在File.Copy完成后完成。所以意图很明显,我们需要一个通知async完成的任务。此方法可以满足您的所有需求,无需async按预期工作。

  

那么,你什么时候需要public async Task Test() { await Copy("test", "test2"); DoPostCopied(whatever); await DoPostCopied2();//Etc }

当您需要在早期任务完成时执行某些代码时,您需要异步(续)。

示例:

async

您可以通过反编译两个版本来验证async和非异步方法之间的区别。它太长了,不会被读取,所以我跳过它在这里发布。

结论:仅在必需时使用{{1}}。在这种情况下,版本1更好,你应该比版本2更喜欢它。

相关问题