29

この質問にはすでに答えがあります。

簡単な質問

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 답변


31

それはほとんど同じです(スレッドなどに関して)。しかし2番目のもの(awaitより多くのオーバーヘッドがコンパイラによって作成されます。

として宣言されたメソッドasyncと使用awaitに変換されますステートマシンコンパイラによって。だからあなたがヒットしたときawait制御フローは呼び出し元のメソッドに返され、実行されます。asyncメソッドの後に再開されますawait待ったときTask終わりました。

あなたの後にこれ以上コードがないのでawait、使用する必要はありませんawaitとにかく。単に返すTask十分です。


  • "待機したとき、制御フローは呼び出し側のメソッドに戻ります。 - 制御フローたぶん特に呼び出したメソッドに戻ることができます。特に、待機しているタスクが既に完了している場合は戻りません。 - acelent
  • 詳細については@ aceth thx、タスクが既に終了したときに何が起こるかについて考えたことはありません。コンパイラが行ごとに実行する内容の正確な詳細がわかりません。 - René Vogt
  • 私は完全にこれを理解していません - monstro
  • タスクが終了すると、スレッドプールからのスレッドがPostメソッドを呼び出し、呼び出し元にタスクが終了したことを通知します。私が覚えているように、非同期メソッドの残りの部分は次のように実行されます。ContinueWith。実行は待機ポイントから続行されますが、別のスレッドで実行することができます。 - Joseph Katzman

5

2つの方法の間にはほとんど違いがありません。基本的に、それらは同じ意味を共有します。ただし、async / await付きのバージョンは、外側のコンパイラ生成タスクで内側のタスクの実行をラップします。非同期バージョンではありません。したがって、非同期でないバージョンは(ごくわずかに)より効率的です。


  • "非同期でないバージョンは(ごくわずかに)より効率的です。 - メソッドが頻繁に呼び出される場合、async / awaitバージョンは顕著なゴミを発生させる可能性があります。それはステートマシンと別のタスクです。 - acelent
  • @ acelent:世代0のゴミを生成することはまだ私にとってかなり限界に近いと感じている - Falanwe
  • わかりました、私はただ指摘したいのですが、必ずしもすべての人に当てはまるわけではありません(1また、タスクやタスクへの参照に頼ることはできません。20:25:40に0:30:20に) - acelent

リンクされた質問


関連する質問

最近の質問