【发布时间】:2016-05-09 14:50:35
【问题描述】:
我一直在阅读 C# 中新的 async 和 await 运算符,并试图弄清楚它们在哪些情况下可能对我有用。我研究了几篇 MSDN 文章,以下是我在字里行间读到的内容:
您可以将async 用于 Windows 窗体和 WPF 事件处理程序,这样它们就可以执行冗长的任务,而不会在执行大部分操作时阻塞 UI 线程。
async void button1_Click(object sender, EventArgs e)
{
// even though this call takes a while, the UI thread will not block
// while it is executing, therefore allowing further event handlers to
// be invoked.
await SomeLengthyOperationAsync();
}
使用await 的方法必须是async,这意味着在代码中某处使用任何async 函数最终会强制调用序列中的所有方法从UI 事件处理程序直到最低级别的@ 987654329@ 方法也是async。
换句话说,如果您创建一个具有普通旧ThreadStart 入口点的线程(或具有旧static int Main(string[] args) 的控制台应用程序),那么您不能使用async 和await,因为在某一时刻你必须使用await,并创建使用它的方法async,因此在调用方法中你还必须使用await并创建一个async等等。但是,一旦您到达线程入口点(或Main()),就没有await 可以控制的调用者了。
所以基本上你不能使用async 和await 没有使用标准WinForms 和WPF 消息循环的GUI。我想这一切确实是有道理的,因为 MSDN 声明async 编程并不意味着多线程,而是使用 UI 线程的空闲时间;当使用控制台应用程序或具有用户定义入口点的线程时,需要多线程来执行异步操作(如果不使用兼容的消息循环)。
我的问题是,这些假设是否准确?
【问题讨论】:
-
+1 提出了一个好问题,即使它完全误解了文档:)
-
查看一些非 GUI 示例 here
标签: c# .net async-await