var options = new ParallelOptions
{
    MaxDegreeOfParallelism = 8,
    CancellationToken = cancellationToken
};
await Parallel.ForEachAsync(endpoints, options,
    async (endpoint, token) =>
    {
        var result = await ProbeAsync(endpoint, target, token);
        observations.Add(result);
    });

Folosiți un grup limitat de lucrători în loc să lansați o sarcină pentru fiecare punct final. Pentru verificările către ținte publice permise, lista gratuită de proxy-uri oferă rânduri candidate; păstrați protocolul fiecărei intrări la construirea sondei. Acest fragment de planificare .NET presupune un ProbeAsync conștient de proxy și un colector observations sigur pentru fire. Opt este o limită ilustrativă, nu un optim măsurat. Sonda are în continuare nevoie de limite pe încercare și de anularea întregii sarcini.

Păstrați fiecare rezultat finalizat împreună cu intrarea sa, chiar dacă ordinea finalizării diferă. Înregistrați protocolul, punctul final, ținta, metoda, timpul scurs și rezultatul. Eșecul conexiunii, refuzul autentificării la proxy, un CONNECT refuzat și un răspuns primit de la site sunt observații diferite.

Deschiderea unui port TCP nu dovedește negocierea cu proxy-ul. Obținerea adresei proxy ca site web diferă, de asemenea, de folosirea ei pentru a solicita ținta.

Alegeți ținta și metoda în funcție de capacitatea necesară. HEAD poate economisi traficul de corp, dar nu dovedește că GET returnează conținut util; un site poate refuza una și permite cealaltă. HTTPS adaugă CONNECT și TLS de destinație care lipsesc din HTTP simplu. O adresă de ieșire este o altă observație din partea destinației, separată de intrarea configurată.

Munca limitată împiedică verificatorul să își epuizeze propriile socketuri, memoria sau planificatorul înainte de a putea evalua ruta. Un rezultat etapizat rămâne util politicii de selecție fără a pretinde că o singură destinație reușită face un punct final bun în toate cazurile.

Articole similare