0

最近、async-await を使用した非同期コードに出くわしました。私の質問は、以下の2つのコードブロックの違いは何ですか-

コードブロック - 1

public async Task Method1(string fileName)
{
    await Method2(fileName);
}

public async Task Method2(string filePath)
{
    await Task.Run(() =>{
         //do some task
    });
}

コードブロック - 2

public async Task Method1(string fileName)
{
    await Method2(fileName);
}

public async Task Method2(string filePath)
{
    Task.Run(() =>{
         //do some task
    });
}

これら 2 つのコードの違いは、Method2 で確認できます。3 番目のメソッド (たとえば Method3) が Method1 を呼び出すとどうなりますか? Method3 から観察された実行の違いは何ですか?

4

2 に答える 2

3

に深刻な問題がありMethod2ます:

public async Task Method2(string filePath)
{
    Task.Run(() =>{
         //do some task
    });
}

これは同期的に実行され、Task完全なオブジェクトを返します ( Task.IsComplete == true)。ただし、戻る前に、Task.Run非同期で実行され、完了ステータスの結果が失われる別のタスク ( を使用) を開始します (「ファイア アンド フォーゲット」)。次のように言い換えるとより理にかなっています。

public Task Method2(string filePath)
{
    return Task.Run(() =>{
         //do some task
    });
}
于 2013-09-22T13:52:29.547 に答える
2

2 番目のコード ブロックでは、Method2 内の Task.Run が完了するのを待たずに Method2 が完了します。

それは、実装に関して何が必要かによって異なります。たとえば、Method2 で変数を初期化する必要があり、呼び出し先がこの変数が初期化されることを期待している場合、2 番目のコード ブロックで予期しないエラーが発生します。

于 2013-09-22T13:12:25.747 に答える