Task.WaitAll in einem WinForms-Click-Handler blockiert das Fenster, selbst wenn die Prüfungen selbst asynchrones HTTP verwenden. Der UI-Thread kann keine Nachrichten verarbeiten, und erfasste Fortsetzungen benötigen möglicherweise genau diesen blockierten Thread.

Unter .NET 6 oder neuer warten Sie stattdessen auf einen begrenzten Batch:

private async void checkButton_Click(object sender, EventArgs e)
{
    checkButton.Enabled = false;
    try
    {
        var entries = proxyList.Lines
            .Where(line => !string.IsNullOrWhiteSpace(line));
        foreach (var batch in entries.Chunk(8))
        {
            var results = await Task.WhenAll(batch.Select(CheckProxyAsync));
            ShowResults(results);
        }
    }
    catch (Exception error)
    {
        ShowCheckError(error);
    }
    finally
    {
        checkButton.Enabled = true;
    }
}

Das gehört in ein vorhandenes Formular, in dem System.Linq und System.Threading.Tasks verfügbar sind. CheckProxyAsync führt begrenzte asynchrone E/A aus und liefert ein Ergebnis; es manipuliert keine Steuerelemente aus einem Hintergrundthread. ShowResults und ShowCheckError sind Anwendungsmethoden.

Die normale await-Fortsetzung kehrt in den UI-Kontext zurück, in dem der Handler begonnen hat, sodass ShowResults Steuerelemente aktualisieren kann. Code, der ausdrücklich auf einem anderen Thread läuft, muss den Steuerelementzugriff über den unterstützten WinForms-Mechanismus marshallen.

Die kostenlose Proxy-Liste kann Eingabeadressen liefern; übergeben Sie nur Protokolle, die CheckProxyAsync implementiert. Acht ist ein Beispielbudget. Der nächste Batch wartet auf die langsamste Prüfung im aktuellen Batch und tauscht etwas Durchsatz gegen begrenzte Aufgabenerstellung. Behalten Sie die Fristen jeder Prüfung und die Abbruchlogik in CheckProxyAsync; das Warten auf einen Batch kann eine unbegrenzte Netzwerkoperation nicht beenden.

Ähnliche Artikel