この質問にはすでに答えがあります。
私の理解では、私が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