gpt4 book ai didi

c# - 异步/等待执行差异

转载 作者:太空狗 更新时间:2023-10-29 21:22:28 26 4
gpt4 key购买 nike

我正试图很好地掌握 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
}

和:

// 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 方法?简单只是为了让我们的代码可读,在处理“异步任务”时优雅。它使我们的代码更好地避免回调和延续等。

Let's break down what Copy method is doing and we answer the question whether we really need it to be async?

Copy 方法只是将调用委托(delegate)给 Task.Run,它返回一个任务,该任务最终在 File.Copy 完成时完成。所以这里的意图很明确,我们需要一个通知 File.Copy 完成的任务。此方法可以满足您的所有需求,无需async 即可按预期工作。

So, When do you need async?

当您需要在较早的任务完成(继续)时执行一些代码时,您需要异步。

例子:

public async Task Test() 
{
await Copy("test", "test2");
DoPostCopied(whatever);
await DoPostCopied2();//Etc
}

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

结论:只有在需要时才使用async。在这种情况下,版本 1 更好,您应该更喜欢它而不是版本 2。

关于c# - 异步/等待执行差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23180947/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com