【发布时间】:2016-12-10 00:17:45
【问题描述】:
我试图深入了解async-await。每当我看到它如何工作的示例时,该示例都会使用一个名为 LongRunningTask 或类似名称的 awaitable 方法,其中是 Task.Delay 或 new WebClient().Download("http://google.com") 或类似名称。我试图弄清楚什么是应该等待的严格定义。它不能简单地是“长期运行的任务”,因为长期运行的任务可能类似于查找大小为 1,000,000,000 的数组的最大子数组,这不会给awaited on 带来任何性能优势如果async-await 确实没有创建任何新线程。
据我了解,如果你有类似的东西
var task = LongRunningTask();
DoSomething();
int x = DoSomethingElse();
int y = await task;
int z = x + y;
然后是块
DoSomething();
int x = DoSomethingElse();
是你向编译器暗示的
“嘿,编译器,如果你能验证这个块没有任何 依赖于
LongRunningTask,反之亦然,然后你可以开始 在LongRunningTask和这段代码之间划分你的工作。 在你完成这个的时候你还没有完成LongRunningTask代码块,然后就完成LongRunningTask,因此 为什么我告诉你await它。”
你能帮我弄清楚吗?
【问题讨论】:
-
Async/await 是在 4.5 中添加的,目的是让面向 WinRT(又名 UWP,又名 Modern UI,又名 Store,又名 Phone)的程序员有机会编写正确的代码。它有一个非常严格的定义,任何可能需要超过 50 毫秒的时间。您可能比 anything 更具选择性,50 毫秒相当严格,我个人使用 1 秒作为“太长”的限制,如果合理的话,会加入沙漏光标。避免耗尽小电池是一个完全不同的考虑,然后它变得严厉。
标签: c# .net asynchronous async-await task-parallel-library