gpt4 book ai didi

c# - "awaitable"任务的严格定义是什么?

转载 作者:太空狗 更新时间:2023-10-29 21:32:30 25 4
gpt4 key购买 nike

我试图深入理解async-await。每当我看到它如何工作的示例时,该示例使用一个名为 LongRunningTask 或类似的 awaitable 方法,其中是一个 Task.Delaynew WebClient().Download("http://google.com") 或类似的东西。我试图弄清楚应该等待什么的严格定义。它不能简单地是“长时间运行的任务”,因为长时间运行的任务可能类似于找到大小为 1,000,000,000 的数组的最大子数组,这不会给 await< 带来任何性能优势ed on 如果 async-await 确实没有创建任何新线程。

据我了解,如果你有类似的东西

var task = LongRunningTask();
DoSomething();
int x = DoSomethingElse();
int y = await task;
int z = x + y;

然后是 block

DoSomething();
int x = DoSomethingElse();

是你向编译器暗示的

"Hey, compiler, if you can verify that this chunk doesn't have any dependencies on LongRunningTask and vice-versa, then you can start dividing your work between LongRunningTask and this chunk of code. It you haven't finished LongRunningTask by the time you finish this chunk of code, then just work on finishing LongRunningTask, hence why I'm telling you await it."

你能帮我理顺一下吗?

最佳答案

await 没有您想象的那么神奇。在您的示例中,关于是否使用其他线程或 I/O 完成例程等的决定不在您显示的任何代码中。

LongRunningTask 的实现是一种返回已启动的 Task 的方法,它已经做出了关于如何任务完成时。

await 所做的就是等待(顾名思义)已经已经开始完成的事情。

现在,if LongRunningTask 是通过创建新任务来实现的,这些任务正在使用使用该线程池的默认调度程序,如果您当前的方法已经在线程池线程上运行并且 LongRunningTask 创建的一些任务正在等待线程池线程变为可用,那么它是可能当遇到 await 时,一直在运行您的代码的同一个线程变得可用,并将用于开始运行等待任务之一。但这基本上是您不需要考虑的事情。

关于c# - "awaitable"任务的严格定义是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41054453/

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