繁体   English   中英

异步/等待执行差异

[英]Async/Await Execution Difference

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

// 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方法中包含等待。

您的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
}

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM