Bir WinForms tıklama işleyicisindeki Task.WaitAll, kontrollerin kendisi zaman uyumsuz HTTP kullansa bile pencereyi engeller. UI iş parçacığı iletileri işleyemez ve yakalanan continuation'lar aynı engellenmiş iş parçacığına ihtiyaç duyabilir.

.NET 6 veya sonrası için bunun yerine sınırlı bir toplu işlem bekleyin:

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

Bu, System.Linq ve System.Threading.Tasks kullanılabilir olan mevcut bir forma aittir. CheckProxyAsync sınırlı zaman uyumsuz giriş ve çıkış yapar ve tek bir sonuç döndürür; arka plan iş parçacığından denetimleri işlemez. ShowResults ve ShowCheckError uygulama yöntemleridir.

await işleminin normal continuation'ı, işleyicinin başladığı UI bağlamına döner, böylece ShowResults denetimleri güncelleyebilir. Açıkça başka bir iş parçacığında çalışan kod, denetim erişimini desteklenen WinForms mekanizması üzerinden iletmelidir.

Ücretsiz proxy listesi giriş adresleri sağlayabilir; yalnızca CheckProxyAsync tarafından uygulanan protokolleri iletin. Sekiz örnek bir bütçedir. Sonraki toplu işlem, geçerli toplu işlemdeki en yavaş kontrolü bekler ve sınırlı görev oluşturma karşılığında bir miktar verimden ödün verir. Her kontrolün son tarihlerini ve iptali CheckProxyAsync içinde tutun; bir toplu işlemi beklemek sınırsız bir ağ işlemini bitiremez.

İlgili makaleler