どこでもデッドロックやパフォーマンス上の理由から、ConfigureAwait(false)
を使用してください。アプリケーションではConfigureAwait
を使用しています。しかし、別のスレッドの実行コンテキストを引き起こしているので、ConfigureAwaitsを削除するかもしれません。ConfigureAwait(false)パフォーマンステスト
異なるスレッドの実行コンテキストが、翻訳時に(時には)問題を引き起こしています。 currentcultureとcurrentUICultureの設定されたカルチャは異なる実行コンテキストでアクセスできないため。
以下のコードで少しテストしました。パフォーマンスの違いはありませんでした。この単純なテストでは、使用されるスレッドがあまりないので、それは良いテストではないことを理解しています。
static async Task MyMethodAsync()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 1000; i++)
{
await Task.Delay(10);
await Task.Delay(10).ConfigureAwait(continueOnCapturedContext: false);
}
stopwatch.Stop();
Console.WriteLine("Await: " + stopwatch.Elapsed.ToString());
}
static async Task MyMethodAsyncNoAwait()
{
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
for (int i = 0; i < 1000; i++)
{
await Task.Delay(10);
await Task.Delay(10);
}
stopwatch.Stop();
Console.WriteLine(stopwatch.Elapsed.ToString());
}
これを正しくテストするにはどうすればよいですか?すべてのConfigureAwaitsを削除することは本当に悪い考えですか?
デッドロックを防ぐために 'ConfigureAwait(false)'は必要ありません。デッドロックは非同期コードでブロックしている場合にのみ発生します。 –
コンソールアプリケーションのようなものでテストしているなら、文脈がないので、とにかく違いはありません。 – Evk
私はパフォーマンスの違いを無視します。 .NET 4.6で異なる 'CurrentCulture' /' CurrentUICulture'値が表示されている場合、それはバグであり、そのように報告する必要があります。 –