私は奪うときのパフォーマンスを比較しています await
私の方法のキーワードは、15倍以上のパフォーマンスを提供します。
次のメソッドは、はるかに優れています:
private static async Task<HttpResponseMessage> AwaitResponse(HttpRequest proxy)
{
foreach (var header in proxy.Request.Headers)
{
Client.Instance.DefaultRequestHeaders.Add(header.Key, header.Value);
}
var response = Client.Instance.SendAsync(proxy.Request).Result;
return response;
}
これよりも:
private static async Task<HttpResponseMessage> AwaitResponse(HttpRequest proxy)
{
foreach (var header in proxy.Request.Headers)
{
Client.Instance.DefaultRequestHeaders.Add(header.Key, header.Value);
}
var response = Client.Instance.SendAsync(proxy.Request);
return await response;
}
お知らせ私はどのように電話していますか 。結果 このメソッドの最初のバージョンでは、
なんでこんなことが起こっているの?そんなに大きなパフォーマンスペナルティがあるのはなぜですか?
その点に注意してください Client
単に静的なインスタンスです。 HttpClient
.
回答:
回答№1は4使用時 await
asyncメソッドが返るまで、コードの実行コンテキストは中断されます。デフォルトでは、 await
新しいスレッドをこれは、元のSynchronizationContextがマーシャリングバックするのをCLRが待つ必要があるため、パフォーマンスに影響することがあります。
一般的に言えば、あなたが残したのと同じスレッドコンテキスト(つまり、クライアントアプリケーションでUIスレッドに戻る)に戻る必要がある場合を除いて、 ConfigureAwait(false)
任意のスレッドで続行します。
回答№2については4
実際にスニペット内の何かにレスポンスを使用していないと仮定すると、実際に非同期/待機またはコールする必要はありません .Result
。あなたはちょうど Task
発信者が待つ、または電話をかける .Result
より高いレベルで。
private static Task<HttpResponseMessage> AwaitResponse(HttpRequest proxy) {
foreach (var header in proxy.Request.Headers) {
Client.Instance.DefaultRequestHeaders.Add(header.Key, header.Value);
}
return Client.Instance.SendAsync(proxy.Request);
}
私はまた、
Async / Await - 非同期プログラミングのベストプラクティス スティーブン・クレアリー
ブロッキングと非同期のコードを混在させない問題と、いつ、どのように ConfigureAwait(false)
あなたができるとき