Task.WaitAll WinForms klik emalçısında pəncərəni bloklayır, hətta yoxlamaların özü asinxron HTTP istifadə etsə də. UI axını mesajları emal edə bilmir və tutulmuş davamlar həmin bloklanmış axına ehtiyac duya bilər.

.NET 6 və ya daha yenisində bunun əvəzinə məhdud partiyanı gözləyin:

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 və System.Threading.Tasks mövcud olan mövcud formaya aiddir. CheckProxyAsync məhdud asinxron I/O yerinə yetirir və bir nəticə qaytarır; fon axınından idarəetmə elementlərini idarə etmir. ShowResults və ShowCheckError tətbiq metodlarıdır.

Adi await davamı emalçının başladığı UI kontekstinə qayıdır, buna görə ShowResults idarəetmə elementlərini yeniləyə bilər. Başqa axında açıq şəkildə işləyən kod idarəetmə elementlərinə girişi dəstəklənən WinForms mexanizmi ilə ötürməlidir.

Pulsuz proksi siyahısı giriş ünvanları verə bilər; yalnız CheckProxyAsync tərəfindən tətbiq olunan protokolları ötürün. Səkkiz nümunə büdcəsidir. Növbəti partiya cari partiyadakı ən yavaş yoxlamanı gözləyir və bununla müəyyən məhsuldarlığı məhdud tapşırıq yaradılması ilə dəyişir. Hər yoxlamanın son tarixlərini və ləğvi CheckProxyAsync daxilində saxlayın; partiyanı gözləmək qeyri-məhdud şəbəkə əməliyyatını bitirə bilməz.

Əlaqəli məqalələr