异步/等待执行差异

Dim*_*rov 6 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
}
Run Code Online (Sandbox Code Playgroud)

和:

// 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");
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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

Sri*_*vel 8

首先让我从两个代码相同的角度开始.

您的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
}
Run Code Online (Sandbox Code Playgroud)

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

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