异步/等待执行差异
我正在努力掌握异步/等待,我想澄清一些混乱。 有人可以解释以下执行方面的差异:
// 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"); // ... }
它们是否会产生相同的代码,为什么我会在另一个上面写一个?
首先让我从两个代码不相同的角度开始。
您的version1代码将只创建一个“状态机”,因为它仅在Test
方法中包含await。
您的version2代码将为Copy
和Test
方法创建两个“状态机”,这会增加一些开销。
为什么我们使用async
方法? 简单只是为了使我们的代码在处理“异步任务”时可读,优雅。 它使我们的代码更好地避免回调和延续等。
让我们分解一下
Copy
方法正在做什么,我们回答一个问题,我们是否真的需要它是async
?
Copy
方法只是将调用委托给Task.Run
,后者返回一个在File.Copy
完成时最终完成的任务。 所以意图很明显,我们需要一个通知File.Copy
完成的任务。 此方法可以满足您的所有需求,无需按预期方式执行async
。
那么,你什么时候需要
async
?
当您需要在早期任务完成时执行某些代码时,您需要异步(Continuation)。
例:
public async Task Test() { await Copy("test", "test2"); DoPostCopied(whatever); await DoPostCopied2();//Etc }
您可以通过反编译两个版本来validationasync
和非异步方法之间的区别。 它太长了,不可读,所以我跳过这里发布。
结论:仅在需要时使用async
。 在这种情况下,版本1更好,你应该比版本2更喜欢它。