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);
    });

Usa un pool di worker limitato invece di avviare un'attività per ogni endpoint. Per i controlli verso obiettivi pubblici consentiti, l'elenco gratuito di proxy fornisce righe candidate; conserva il protocollo di ogni voce quando costruisci la sonda. Questo frammento di pianificazione .NET presuppone un ProbeAsync consapevole del proxy e un raccoglitore observations sicuro rispetto ai thread. Otto è un limite illustrativo, non un ottimo misurato. La sonda necessita comunque di limiti per tentativo e della cancellazione dell'intero lavoro.

Conserva ogni risultato completato insieme al suo input anche quando l'ordine di completamento è diverso. Registra protocollo, endpoint, obiettivo, metodo, tempo trascorso ed esito. Il guasto della connessione, il rifiuto dell'accesso al proxy, un CONNECT negato e una risposta ricevuta dal sito sono osservazioni diverse.

L'apertura di una porta TCP non dimostra la negoziazione con il proxy. Recuperare l'indirizzo del proxy come sito web è anch'esso diverso dall'usarlo per richiedere l'obiettivo.

Scegli obiettivo e metodo in base alla capacità richiesta. HEAD può risparmiare traffico del corpo ma non dimostra che GET restituisca contenuto utile; un sito può rifiutare l'uno e consentire l'altro. HTTPS aggiunge CONNECT e TLS di destinazione assenti nell'HTTP semplice. Un indirizzo di uscita è un'altra osservazione lato destinazione, separata dall'ingresso configurato.

Il lavoro limitato impedisce al verificatore di esaurire i propri socket, la memoria o lo scheduler prima di poter valutare il percorso. Un risultato a fasi resta utile alla politica di selezione senza fingere che una destinazione riuscita renda un endpoint universalmente buono.

Articoli correlati