私は、非同期コードをブロックしないことを強く主張しています。デッドロックの可能性がない場合でも、コンパイラーによって生成された効率の低い状態マシンを実行するよりも、常に同期APIを使用する方が良いと感じました。
ただし、System.Net.HttpClient
の特定のケースでは、(コンソールアプリのように)完全に非同期にできないコードの場合、WebRequestのようなものを使用するよりも、HttpClientの接続キャッシュを利用する方が良いでしょう。呼び出しごとにTCPセッションをネゴシエートしますか?
.Result
でブロックしたとしても、代わりに同期APIを使用する理由よりも、HttpClientを再利用することの利点を考え始めています。
もちろん、これはHttpClientが共有インスタンスであり、再利用され、コンソールアプリやasp.netコアなどのコンテキストフリー環境で動作していることを前提としています。
コンソールアプリでブロックする必要はもうありません。
そうした場合でも、MainからMainAsync()を呼び出して、それをブロックすることができます。 HttpClient呼び出しをブロックする必要はありませんし、ブロックすべきではありません。
コンパイラーによって生成された効率の低い状態マシンを実行するよりも、常に同期APIを使用するほうが良いと感じました
あなたの気持ちは間違っています。作業中のフレームワークが待機中にスレッドを再利用しない場合でも、youは待機中にスレッドを使用できます。
個人的には、非同期コードよりもスレッドコードの方が理解し、推論する方が簡単だと思います(あなたの傾向に直接矛盾するわけではありませんが、別のバイアスがあるかもしれないと示唆しています)。
HttpClientが「完全に非同期」にならないという意味がわかりません。私はHttpClientの.net実装を見ていませんが、完全に非同期で実装できない理由はありません-epoll/wantformultipleevents/selectを使用するだけです。
私が知る限りでは、HttpClientは新しいMSFT .net APIです。通常、MSFTがすでにサポートしているものに対して新しいAPIが登場すると、最終的には古いAPIを非推奨/非サポートにするので、その理由からHttpClientを使用します。
接続キャッシュが役立つかどうかは、アプリケーションの性質によって異なります。それは助けるか、または傷つけることができます。同じサーバーに(同じHTTPクライアントを使用して)要求を行う場合、接続キープアライブが役立ちます。これを行わないと、パフォーマンスが厳密に低下します。