Dns.BeginGetHost… blokowanie metod
Więc chcę zrobićlos zapytań DNS.
Tworzę (tysiące) zadań zBegin/EndGetHostEntry
asynchroniczna para:
var lookupTask = Task.Factory.FromAsync
( Dns.BeginGetHostEntry,
(Func<IAsyncResult, IPHostEntry>) Dns.EndGetHostEntry,
"google.com",
null
)
następnieTask.WaitAll
aby wszystko się zakończyło. Widzę liczbęThreadPool
wątki drastycznie rosną w odpowiedzi na moje prośby. Jeśli wymuszęThreadPool
minThreads
do 500, obciążenie jest zużywane znacznie szybciej. Wszystko to wskazuje na blokowanie wDns
implementacja asynchroniczna.
Jeśli wymienięDns
zzarządzany klient Dns, Mogę zużyć to samo obciążenie z tylko 1 lub 2 wątkami wThreadPool
z cpu praktycznie na biegu jałowym.
Rzecz w tym, żeDns
implementacja jest całkowicie rdzeniem wielu sieciowych interfejsów API (HttpWebRequest
, WebClient
, HttpClient
) i wydaje się, że problem ten dotyczy wszystkich. Jeśli rozwiążę DNS za pomocą biblioteki innej firmy i wykonam żądania HTTP przy użyciu adresu IP jako hosta w uri, zmieńHost
nagłówek, aby naprawić żądanie, dostaję niesamowitą wydajność w porównaniu do czegokolwiekSystem.Net.Dns
.
Co tu się dzieje? Czy coś przeoczyłem lub jestSystem.Net.Dns
wdrożenie naprawdę tak źle?