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)
它们是否会产生相同的代码,为什么我会在另一个上面写一个?
首先让我从两个代码不相同的角度开始.
您的version1代码将只创建一个"状态机",因为它Test仅包含方法中的等待.
你的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
}
Run Code Online (Sandbox Code Playgroud)
您可以async通过反编译两个版本来验证这种区别和非异步方法之间的区别.它太长了,不可读,所以我跳过它在这里发布.
结论:async仅在需要时使用.在这种情况下,版本1更好,你应该比版本2更喜欢它.