Dns.BeginGetHost ...方法阻塞

spe*_*der 14 c# dns asynchronous blocking

所以我想做很多 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实施真的那么糟糕吗?

Pen*_*puu 3

System.Net.Dns 使用 Windowsgethostbyname函数进行 DNS 查询,并且根本没有异步函数。BeginGetHostEntry 函数基本上只是线程池上同步 GetHostEntry 调用的包装器。

上次我在缓慢/同步 DNS 查找方面遇到了同样的问题,我最终只是使用了一个大的 ThreadPool 来完成工作,因为没有一个内置的 Windows 或 .net DNS 相关函数支持正确的(并行)异步执行。