この質問にはすでに答えがあります。
私の理解では、私が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つの実装に違いはありますか?
1つの市長の違いはあなたが呼び出すスレッドならばawaitからのSynchronizationContext、awaitその中の継続をスケジュールしますSynchronizationContextデフォルトで。したがって、待った後は、以前と同じスレッドに戻ります。あなたはそれを変更することができます.ConfigureAwait(false)。
あり.ContinueWith()これは逆のやり方ですが、デフォルトでは、渡さない限り、任意の(スレッドプール)スレッドでスケジュールされます。TaskScheduler.FromCurrentSynchronizationContext()それに。
.Wait()の中に.ContinueWith()例です。答えが説明するようにこれは実際の市長の違いです。 - bitbonk