Dns.BeginGetHost… блокировка методов

Итак, я хочу сделать много DNS-запросов.

Я создаю (тысяч )Задач из Begin/EndGetHostEntryасинхронной пары:

var lookupTask = Task.Factory.FromAsync
   ( Dns.BeginGetHostEntry,
     (Func) Dns.EndGetHostEntry,
     "google.com", 
     null
   )

затем Task.WaitAllдля завершения всего. Я вижу, что количество потоков ThreadPoolрезко увеличивается в ответ на мои запросы. Если я заставлюThreadPoolminThreadsдо 500 рабочая нагрузка потребляется значительно быстрее. Все это указывает на блокировку в Dnsасинхронной реализации.

Если я заменю Dnsуправляемым DNS-клиентом , я смогу потреблять ту же рабочую нагрузку только с 1 или 2 потоками в ThreadPoolс практически бездействующим процессором.

Дело в том, что реализация Dnsабсолютно необходима для многих сетевых API (HttpWebRequest., WebClient,HttpClient), и все они, кажется, затронуты этой проблемой. Если я разрешаю DNS с помощью сторонней библиотеки и делаю HTTP-запросы, используя IP-адрес в качестве хоста в uri, а затем изменяю заголовок Host, чтобы исправить запрос, я получаю невероятную производительность по сравнению со всем, что связано с System.Net.Dns.

Что тут происходит? Я что-то пропустил или реализация System.Net.Dnsдействительно так плоха?

14
задан spender 14 July 2012 в 03:20
поделиться