Dns.BeginGetHost… методы блокировки
Поэтому я хочу сделатьlot 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-клиентЯ могу использовать ту же рабочую нагрузку только с 1 или 2 потоками вThreadPool
с процессором практически на холостом ходу.
Дело в том, чтоDns
реализация является абсолютно основной для многих сетевых API (HttpWebRequest
, WebClient
, HttpClient
), и все они, похоже, затронуты этой проблемой. Если я разрешу DNS с помощью сторонней библиотеки и сделаю HTTP-запросы, используя IP-адрес в качестве хоста в URI, то изменитеHost
заголовок, чтобы исправить запрос, я получаю высокую производительность по сравнению с чем-либо, связанным сSystem.Net.Dns
.
Что здесь происходит? Я что-то пропустил или этоSystem.Net.Dns
реализация действительно так плохо?