/ / asyncは、sync-c#、asp.net、asp.net-web-api、async-await、dotnet-httpclientよりも15倍長い

同期よりも15倍長い非同期#、asp.net、asp.net-web-api、async-await、dotnet-httpclient

私は奪うときのパフォーマンスを比較しています 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

使用時 awaitasyncメソッドが返るまで、コードの実行コンテキストは中断されます。デフォルトでは、 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) あなたができるとき