Dns.BeginGetHost… métodos bloqueando
Así que quiero hacer unmucho de consultas de DNS.
Creo (miles) de tareas desde elBegin/EndGetHostEntry
par asíncrono:
var lookupTask = Task.Factory.FromAsync
( Dns.BeginGetHostEntry,
(Func<IAsyncResult, IPHostEntry>) Dns.EndGetHostEntry,
"google.com",
null
)
entoncesTask.WaitAll
para que todo se complete. Estoy viendo el numero deThreadPool
subprocesos aumentan drásticamente en respuesta a mis solicitudes. Si fuerzo elThreadPool
minThreads
a 500, la carga de trabajo se consume considerablemente más rápido. Todo esto apunta a bloquear en elDns
Implementación asíncrona.
Si sustituyoDns
con uncliente Dns gestionado, Puedo consumir la misma carga de trabajo con solo 1 o 2 subprocesos en elThreadPool
con cpu prácticamente inactivo.
La cosa es, laDns
la implementación es absolutamente esencial para muchas API de red (HttpWebRequest
, WebClient
, HttpClient
), y todos parecen estar afectados por este problema. Si resuelvo DNS con una biblioteca de terceros, y hago solicitudes HTTP utilizando la dirección IP como host en el uri, modifico laHost
Encabezado para arreglar la solicitud, obtengo un rendimiento increíble en comparación con cualquier cosa que involucreSystem.Net.Dns
.
¿Que está pasando aqui? ¿Me he perdido algo o es elSystem.Net.Dns
¿Realmente la implementación es tan mala?