This question already has an answer here:
Quick question..
In order to get some solid base understanding about Asynchronous Programming and the await
I would like to know what is the difference between these two code snippets when it comes to multi threading and the execution sequence and time:
This:
public Task CloseApp()
{
return Task.Run(
()=>{
// save database
// turn off some lights
// shutdown application
});
}
Versus this:
public async Task CloseApp()
{
await Task.Run(
()=>{
// save database
// turn off some lights
// shutdown application
});
}
if I am calling it in this routine:
private async void closeButtonTask()
{
// Some Task 1
// ..
await CloseApp();
// Some Task 2
// ..
}
There are very few differences between the two approaches. Basically, they share the same semantics. However, the version with async/await wraps the execution of the inner task in an outer compiler-generated task. The non-async version does not. Thus, the non-async version is (very marginally) more efficient.
It is almost the same (in terms of threads etc.). But for the second one (using
await
) a lot more overhead will be created by the compiler.Methods declared as
async
and usingawait
are converted into a state machine by the compiler. So when you hit theawait
, the control flow is returned to the calling method and execution of yourasync
method is resumed after theawait
when the awaitedTask
has finished.As there is no more code after your
await
, there is no need to useawait
anyway. Simply return theTask
is enough.