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 grupo de trabajadores acotado en lugar de lanzar una tarea por cada extremo. Para las comprobaciones contra objetivos públicos permitidos, la lista gratuita de proxies aporta filas candidatas; conserva el protocolo de cada entrada al construir la sonda. Este fragmento de planificación de .NET supone un ProbeAsync consciente del proxy y un recopilador observations seguro para hilos. Ocho es un límite ilustrativo, no un óptimo medido. La sonda aún necesita límites por intento y cancelación de todo el trabajo.

Conserva cada resultado completado junto con su entrada aunque el orden de finalización sea distinto. Registra protocolo, extremo, objetivo, método, tiempo transcurrido y desenlace. El fallo de conexión, el rechazo del inicio de sesión en el proxy, un CONNECT denegado y una respuesta recibida del sitio son observaciones diferentes.

Que se abra un puerto TCP no demuestra la negociación con el proxy. Obtener la dirección del proxy como si fuera un sitio web también difiere de usarla para solicitar el objetivo.

Elige el objetivo y el método según la capacidad requerida. HEAD puede ahorrar tráfico de cuerpo, pero no demuestra que GET devuelva contenido útil; un sitio puede rechazar uno y permitir el otro. HTTPS añade CONNECT y TLS de destino que no existen en HTTP simple. Una dirección de salida es otra observación del lado del destino, separada de la entrada configurada.

El trabajo acotado evita que el comprobador agote sus propios sockets, memoria o planificador antes de poder evaluar la ruta. Un resultado por etapas sigue siendo útil para la política de selección sin fingir que un destino exitoso hace que un extremo sea bueno en todos los casos.

Artículos relacionados