2017-06-07 8 views
1

どこでもデッドロックやパフォーマンス上の理由から、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を削除することは本当に悪い考えですか?

+1

デッドロックを防ぐために 'ConfigureAwait(false)'は必要ありません。デッドロックは非同期コードでブロックしている場合にのみ発生します。 –

+2

コンソールアプリケーションのようなものでテストしているなら、文脈がないので、とにかく違いはありません。 – Evk

+0

私はパフォーマンスの違いを無視します。 .NET 4.6で異なる 'CurrentCulture' /' CurrentUICulture'値が表示されている場合、それはバグであり、そのように報告する必要があります。 –

答えて

6

パフォーマンスのために盲目的にConfigureAwaitを使用しないでください。同じスレッド/同期コンテキストでの再開が重要でないコード(通常はライブラリコード)を記述するときに使用します。正しいスレッド/同期コンテキストで再開した場合となりますが、ConfigureAwait(false)はコードを壊してしまいます。

0

これまでにasync-awaitで行ったことは、パフォーマンスは向上していますが、応答性と可用性に関するものではありません。

WinForms、WPF、UWPなどのクライアントUIでは、応答性に関するものです。 IOスレッドおよびCPUバウンド操作ではasync-awaitを使用し、UIスレッド以外での作業はConfigureAwait(false)を使用して、そのUIスレッドに戻ってくることを明示的に回避します。

ASP.NET(.NET Frameworkではなく、.NET Core)では利用可能です。 IO操作でasync-awaitを使用してスレッドを解放して他の要求を処理し、ConfigureAwait(false)を使用してHTTPコンテキストスレッドとしてスレッドに戻る設定を回避します。

しかし、いつもより多くの作業をしているので、各論理操作に時間がかかります。

クライアントUIでは、ユーザーはアプリケーションで作業することも、少なくともタイトルバーとタスクマネージャで「応答しない」というフレーズを取得することはできません。

ASP.NETの場合、要求を処理するために使用可能なスレッドが他にもあるため、負荷が大きい場合、要求キュー内でブロックされずにすぐに作業を開始できるため、処理速度が向上します。

関連する問題