Dns.BeginGetHost… Methoden blockieren
Also möchte ich eine machenMenge von DNS-Abfragen.
Ich erstelle (Tausende) Aufgaben aus demBegin/EndGetHostEntry
Asynchrones Paar:
var lookupTask = Task.Factory.FromAsync
( Dns.BeginGetHostEntry,
(Func<IAsyncResult, IPHostEntry>) Dns.EndGetHostEntry,
"google.com",
null
)
dannTask.WaitAll
für alles zu vervollständigen. Ich sehe die Nummer vonThreadPool
Die Anzahl der Threads nimmt aufgrund meiner Anfragen drastisch zu. Wenn ich das erzwingeThreadPool
minThreads
bis 500 wird die Arbeitslast erheblich schneller verbraucht. All dies deutet auf eine Blockierung im Internet hinDns
asynchrone Implementierung.
Wenn ich ersetzeDns
mit einerDNS-Client verwaltetIch kann die gleiche Arbeitslast mit nur 1 oder 2 Threads in Anspruch nehmenThreadPool
mit CPU praktisch im Leerlauf.
Die Sache ist dieDns
Die Implementierung ist für viele Netzwerk-APIs von zentraler Bedeutung (HttpWebRequest
, WebClient
, HttpClient
), und alle scheinen von diesem Problem betroffen zu sein. Wenn ich DNS mit einer Drittanbieter-Bibliothek auflöse und HTTP-Anforderungen unter Verwendung der IP-Adresse als Host in der URI stelle, ändern Sie dieHost
Header, um die Anfrage zu beheben, bekomme ich im Vergleich zu irgendetwas mit BlasenbildungSystem.Net.Dns
.
Was ist denn hier los? Habe ich etwas verpasst oder ist dasSystem.Net.Dns
Umsetzung wirklich so schlecht?