Vérifier une liste de proxies avec une concurrence bornée
Bornez les vérifications de proxies simultanées et consignez ce que chaque vérification a réellement établi pour le site cible.
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);
});Utilisez un pool de workers borné plutôt que de lancer une tâche pour chaque point de terminaison. Pour les vérifications visant des cibles publiques autorisées, la liste gratuite de proxies fournit des lignes candidates ; conservez le protocole de chaque entrée au moment de construire la sonde. Cet extrait d'ordonnancement .NET suppose un ProbeAsync conscient du proxy et un collecteur observations sûr vis-à-vis des threads. Huit est une borne illustrative, pas un optimum mesuré. La sonde a encore besoin de limites par tentative et d'une annulation de la tâche entière.
Conservez chaque résultat terminé avec son entrée, même lorsque l'ordre d'achèvement diffère. Consignez le protocole, le point de terminaison, la cible, la méthode, le temps écoulé et l'issue. Un échec de connexion, un refus d'identification au proxy, un CONNECT refusé et une réponse reçue du site sont des observations différentes.
L'ouverture d'un port TCP ne prouve pas la négociation avec le proxy. Récupérer l'adresse du proxy comme un site web diffère aussi de son utilisation pour demander la cible.
Choisissez la cible et la méthode selon la capacité requise. HEAD peut économiser le trafic de corps mais ne prouve pas que GET renvoie un contenu utile ; un site peut refuser l'un et autoriser l'autre. HTTPS ajoute CONNECT et le TLS de destination absents du HTTP simple. Une adresse de sortie est une autre observation côté destination, distincte de l'entrée configurée.
Un travail borné empêche le vérificateur d'épuiser ses propres sockets, sa mémoire ou son ordonnanceur avant de pouvoir évaluer la route. Un résultat par étapes reste utile à la politique de sélection sans laisser croire qu'une destination réussie rend un point de terminaison universellement bon.