相关疑难解决方法(0)

Dns.BeginGetHost ...方法阻塞

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

c# dns asynchronous blocking

14
推荐指数
1
解决办法
2385
查看次数

标签 统计

asynchronous ×1

blocking ×1

c# ×1

dns ×1