所以我想做很多 DNS查询.
我从Begin/EndGetHostEntry异步对中创建了(数千个)任务:
var lookupTask = Task.Factory.FromAsync
( Dns.BeginGetHostEntry,
(Func<IAsyncResult, IPHostEntry>) Dns.EndGetHostEntry,
"google.com",
null
)
Run Code Online (Sandbox Code Playgroud)
然后Task.WaitAll一切都要完成.我看到ThreadPool响应我的请求,线程数量急剧增加.如果我强制ThreadPool minThreads转到500,则工作量的消耗会大大加快.所有这些都指向Dns异步实现中的阻塞.
如果我Dns用托管Dns客户端替换,我可以消耗相同的工作负载,只有1或2个线程在ThreadPoolcpu中几乎空闲.
问题是,在Dns实现绝对核心,许多网络API( ,HttpWebRequest,WebClient),HttpClient他们似乎都受到这个问题的影响.如果我使用第三方库解析DNS,并使用IP地址作为uri中的主机发出HTTP请求,则更改Host标头以修复请求,与任何涉及的内容相比,我的性能都很高System.Net.Dns.
这里发生了什么?我错过了什么或者System.Net.Dns实施真的那么糟糕吗?