异步/等待执行差异

我正在努力掌握异步/等待,我想澄清一些混乱。 有人可以解释以下执行方面的差异:

// 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代码将为CopyTest方法创建两个“状态机”,这会增加一些开销。

为什么我们使用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更喜欢它。