web-dev-qa-db-ja.com

「非同期タスク、タスク待機」対「タスク、タスク復帰」

簡単な質問..

非同期プログラミングと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
    // ..
}
39
Khalil Khalaf

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

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

awaitの後にコードがなくなるため、awaitを使用する必要はありません。単にTaskを返すだけで十分です。

39
René Vogt

2つのアプローチの違いはほとんどありません。基本的に、それらは同じセマンティクスを共有します。ただし、async/awaitを使用したバージョンは、コンパイラーが生成した外部タスクで内部タスクの実行をラップします。非非同期バージョンはサポートしていません。したがって、非非同期バージョンは(非常にわずかに)より効率的です。

6
Falanwe