我一直在阅读关于C#中新的async
和await
运算符的内容,并尝试弄清楚它们可能对我有什么用处。我研究了几篇MSDN文章,以下是我读懂的内容:
你可以在Windows Forms和WPF事件处理程序中使用async
,这样它们就能够在执行大部分操作时不会阻塞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事件处理程序到最低级async
方法的所有调用序列中的方法也成为async
的。换句话说,如果您使用普通的老式
ThreadStart
入口点创建线程(或使用老式的static int Main(string[] args)
控制台应用程序),则不能使用async
和await
,因为在某个时刻您必须使用await
,并使使用它的方法成为async
,因此在调用方法中,您还必须使用await
并使其成为async
,以此类推。但是一旦到达线程入口点(或Main()
),就没有调用者可以将await
控制权交出去。因此,如果没有使用标准的WinForms和WPF消息循环的GUI,您基本上无法使用
async
和await
。我想这一切确实有道理,因为MSDN指出async
编程并不意味着多线程,而是利用UI线程的空闲时间。当使用控制台应用程序或具有用户定义入口点的线程时,执行异步操作需要使用多线程(如果不使用兼容的消息循环)。我的问题是,这些假设准确吗?