I've been reading about the new async
and await
operators in C# and tried to figure out in which circumstances they would possibly be useful to me. I studied several MSDN articles and here's what I read between the lines:
You can use async
for Windows Forms and WPF event handlers, so they can perform lengthy tasks without blocking the UI thread while the bulk of the operation is being executed.
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();
}
A method using await
must be async
, which means that the usage of any async
function somewhere in your code ultimately forces all methods in the calling sequence from the UI event handlers up until the lowest-level async
method to be async
as well.
In other words, if you create a thread with an ordinary good old ThreadStart
entry point (or a Console application with good old static int Main(string[] args)
), then you cannot use async
and await
because at one point you would have to use await
, and make the method that uses it async
, and hence in the calling method you also have to use await
and make that one async
and so on. But once you reach the thread entry point (or Main()
), there's no caller to which an await
would yield control to.
So basically you cannot use async
and await
without having a GUI that uses the standard WinForms and WPF message loop. I guess all that makes indeed sense, since MSDN states that async
programming does not mean multithreading, but using the UI thread's spare time instead; when using a console application or a thread with a user defined entry point, multithreading would be necessary to perform asynchronous operations (if not using a compatible message loop).
My question is, are these assumptions accurate?
See Question&Answers more detail:
os 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…