我试图很好地掌握异步/等待,我想澄清一些混乱。有人可以解释下列执行方面的差异:
// 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");
// ...
}
它们是否会产生相同的代码,为什么我会将其中一个写在另一个上?
答案 0 :(得分:8)
首先让我先谈谈两个代码不相同。
你的version1代码只会创建一个"状态机"因为它只包含等待Test
方法。
你的version2代码将创建两个"状态机" Copy
和Test
方法会增加一些开销。
为什么我们使用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更喜欢它。