web-dev-qa-db-ja.com

WebRequestのような同期APIを使用するよりも、HttpClientで非同期でブロックする方が良いですか?

私は、非同期コードをブロックしないことを強く主張しています。デッドロックの可能性がない場合でも、コンパイラーによって生成された効率の低い状態マシンを実行するよりも、常に同期APIを使用する方が良いと感じました。

ただし、System.Net.HttpClientの特定のケースでは、(コンソールアプリのように)完全に非同期にできないコードの場合、WebRequestのようなものを使用するよりも、HttpClientの接続キャッシュを利用する方が良いでしょう。呼び出しごとにTCPセッションをネゴシエートしますか?

.Resultでブロックしたとしても、代わりに同期APIを使用する理由よりも、HttpClientを再利用することの利点を考え始めています。

もちろん、これはHttpClientが共有インスタンスであり、再利用され、コンソールアプリやasp.netコアなどのコンテキストフリー環境で動作していることを前提としています。

2
Crowcoder

コンソールアプリでブロックする必要はもうありません。

https://stackoverflow.com/questions/9208921/cant-specify-the-async-modifier-on-the-main-method-of-a-console-app

そうした場合でも、MainからMainAsync()を呼び出して、それをブロックすることができます。 HttpClient呼び出しをブロックする必要はありませんし、ブロックすべきではありません。

コンパイラーによって生成された効率の低い状態マシンを実行するよりも、常に同期APIを使用するほうが良いと感じました

あなたの気持ちは間違っています。作業中のフレームワークが待機中にスレッドを再利用しない場合でも、youは待機中にスレッドを使用できます。

5
Ewan

個人的には、非同期コードよりもスレッドコードの方が理解し、推論する方が簡単だと思います(あなたの傾向に直接矛盾するわけではありませんが、別のバイアスがあるかもしれないと示唆しています)。

HttpClientが「完全に非同期」にならないという意味がわかりません。私はHttpClientの.net実装を見ていませんが、完全に非同期で実装できない理由はありません-epoll/wantformultipleevents/selectを使用するだけです。

私が知る限りでは、HttpClientは新しいMSFT .net APIです。通常、MSFTがすでにサポートしているものに対して新しいAPIが登場すると、最終的には古いAPIを非推奨/非サポートにするので、その理由からHttpClientを使用します。

接続キャッシュが役立つかどうかは、アプリケーションの性質によって異なります。それは助けるか、または傷つけることができます。同じサーバーに(同じHTTPクライアントを使用して)要求を行う場合、接続キープアライブが役立ちます。これを行わないと、パフォーマンスが厳密に低下します。

0
Lewis Pringle