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?

Antworten auf die Frage(4)

Ihre Antwort auf die Frage