所以我想做很多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 客户端ThreadPool
替换,我可以在cpu 几乎处于空闲状态的情况下仅使用 1 或 2 个线程来消耗相同的工作负载。
问题是,Dns
实现绝对是许多网络 API(、、、)的核心HttpWebRequest
,WebClient
而且HttpClient
它们似乎都受到这个问题的影响。如果我使用 3rd 方库解析 DNS,并使用 IP 地址作为 uri 中的主机发出 HTTP 请求,然后更改Host
标头以修复请求,与任何涉及System.Net.Dns
.
这里发生了什么?我错过了什么还是System.Net.Dns
实施真的那么糟糕?