この質問にはすでに答えがあります。
簡単な質問
Asynchronous ProgrammingとC ++に関する理解を深めるためにawaitマルチスレッドと実行の順序と時間に関して、これら2つのコードスニペットの違いは何ですか。
この:
public Task CloseApp()
{
return Task.Run(
()=>{
// save database
// turn off some lights
// shutdown application
});
}
これに対して:
public async Task CloseApp()
{
await Task.Run(
()=>{
// save database
// turn off some lights
// shutdown application
});
}
私はこのルーチンでそれを呼んでいるなら:
private async void closeButtonTask()
{
// Some Task 1
// ..
await CloseApp();
// Some Task 2
// ..
}
それはほとんど同じです(スレッドなどに関して)。しかし2番目のもの(awaitより多くのオーバーヘッドがコンパイラによって作成されます。
として宣言されたメソッドasyncと使用awaitに変換されますステートマシンコンパイラによって。だからあなたがヒットしたときawait制御フローは呼び出し元のメソッドに返され、実行されます。asyncメソッドの後に再開されますawait待ったときTask終わりました。
あなたの後にこれ以上コードがないのでawait、使用する必要はありませんawaitとにかく。単に返すTask十分です。
Postメソッドを呼び出し、呼び出し元にタスクが終了したことを通知します。私が覚えているように、非同期メソッドの残りの部分は次のように実行されます。ContinueWith。実行は待機ポイントから続行されますが、別のスレッドで実行することができます。 - Joseph Katzman
2つの方法の間にはほとんど違いがありません。基本的に、それらは同じ意味を共有します。ただし、async / await付きのバージョンは、外側のコンパイラ生成タスクで内側のタスクの実行をラップします。非同期バージョンではありません。したがって、非同期でないバージョンは(ごくわずかに)より効率的です。