0

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

私の理解では、私がasync関数を待っているなら、次のコードはデリゲートにラップされ、async関数が戻った後に実行されます。

async bool Test()
{
    await byte[] arr = ReadAsync(....)

    // all following code will be wrapped into a delegate
    if (arr != null)
    {
        // Do something

        return true;
    }

    return false;
}

次のコードをContinueWithで明示的にラップした場合と同じように聞こえます。

async bool Test()
{
    bool res = await ReadAsync(...)
                    .ContinueWith(t => 
                    {
                        byte[] arr = t.Result;
                        if (arr != null)
                        {
                            // Do something
                            return true;
                        }
                        return false;
                    });
}

これら2つの実装に違いはありますか?


  • ポスターにも追加のものがあるので、これは重複しているとはあまり言いません。.Wait()の中に.ContinueWith()例です。答えが説明するようにこれは実際の市長の違いです。 - bitbonk

1 답변


4

1つの市長の違いはあなたが呼び出すスレッドならばawaitからのSynchronizationContextawaitその中の継続をスケジュールしますSynchronizationContextデフォルトで。したがって、待った後は、以前と同じスレッドに戻ります。あなたはそれを変更することができます.ConfigureAwait(false)

あり.ContinueWith()これは逆のやり方ですが、デフォルトでは、渡さない限り、任意の(スレッドプール)スレッドでスケジュールされます。TaskScheduler.FromCurrentSynchronizationContext()それに。


  • ありがとう。それで、それらの実装の詳細の違いの他に、どの実装を使用すべきであるかのパフォーマンスへの影響または実践提案はありますか? - codewarrior
  • @codewarrior「実装の詳細の違い」ではなく、実際にプログラマとして考える必要があることで、正常コードと正常コードの違いが生じる可能性があります。動作していないコード)。 - user743382

リンクされた質問


関連する質問

最近の質問