だから私はたくさんのDNSクエリを作りたいです。
Begin/EndGetHostEntry
非同期ペアから (数千の) タスクを作成します。
var lookupTask = Task.Factory.FromAsync
( Dns.BeginGetHostEntry,
(Func<IAsyncResult, IPHostEntry>) Dns.EndGetHostEntry,
"google.com",
null
)
その後Task.WaitAll
、すべてが完了します。リクエストに応じて、スレッド数ThreadPool
が大幅に増加しています。強制的ThreadPool
minThreads
に 500 にすると、ワークロードがかなり速く消費されます。Dns
これらはすべて、非同期実装でのブロッキングを示しています。
マネージド DNS クライアントに置き換えるDns
と、CPU の仮想アイドリングで 1 つまたは 2 つのスレッドだけで同じワークロードを消費できます。ThreadPool
問題は、この実装が多くのネットワーク API ( 、、 )Dns
の中核をなすものであり、それらすべてがこの問題の影響を受けているように見えることです。サードパーティのライブラリで DNS を解決し、URI のホストとして IP アドレスを使用して HTTP リクエストを作成し、ヘッダーを変更してリクエストを修正すると、.HttpWebRequest
WebClient
HttpClient
Host
System.Net.Dns
何が起きてる?私は何かを見逃したのでしょうか、それともSystem.Net.Dns
実装が本当に悪いのでしょうか?