我一直在阅读 C# 中的 newasync
和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
must be的方法async
,这意味着async
在代码中某处使用任何函数最终会强制调用序列中的所有方法从 UI 事件处理程序一直到最低级别的async
方法async
。
换句话说,如果您创建一个具有普通 good oldThreadStart
入口点的线程(或具有 good old 的控制台应用程序static int Main(string[] args)
),那么您不能使用async
andawait
因为在某一时刻您必须使用await
, 并制作使用它的方法async
,并且因此,在调用方法中,您还必须使用await
并制作该方法async
,依此类推。但是,一旦您到达线程入口点(或Main()
),就没有调用者await
可以让其控制。
所以基本上你不能使用async
并且await
没有使用标准 WinForms 和 WPF 消息循环的 GUI。我想这一切确实是有道理的,因为 MSDN 声明async
编程并不意味着多线程,而是使用 UI 线程的空闲时间;当使用控制台应用程序或具有用户定义的入口点的线程时,需要多线程来执行异步操作(如果不使用兼容的消息循环)。
我的问题是,这些假设是否准确?