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 реализация действительно так плохо?

Ответы на вопрос(4)

Ваш ответ на вопрос