Task.WaitAll dalam pengendali klik WinForms menyekat tetingkap walaupun semakan itu sendiri menggunakan HTTP tak segerak. Benang UI tidak dapat memproses mesej, dan sambungan yang ditangkap mungkin memerlukan benang tersekat yang sama.

Untuk .NET 6 atau lebih baharu, tunggu kelompok terikat sebagai gantinya:

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

Ini tergolong dalam borang sedia ada dengan System.Linq dan System.Threading.Tasks tersedia. CheckProxyAsync melakukan input dan output tak segerak terikat dan mengembalikan satu hasil; ia tidak mengendalikan kawalan daripada benang latar belakang. ShowResults dan ShowCheckError ialah kaedah aplikasi.

Sambungan await biasa kembali ke konteks UI tempat pengendali bermula, jadi ShowResults boleh mengemas kini kawalan. Kod yang berjalan secara eksplisit pada benang lain mesti menyalurkan akses kawalan melalui mekanisme WinForms yang disokong.

Senarai proxy percuma boleh membekalkan alamat input; hantar hanya protokol yang dilaksanakan oleh CheckProxyAsync. Lapan ialah belanjawan contoh. Kelompok seterusnya menunggu semakan paling perlahan dalam kelompok semasa, menukar sedikit daya pemprosesan untuk penciptaan tugas terikat. Kekalkan tarikh akhir setiap semakan dan pembatalan dalam CheckProxyAsync; menunggu kelompok tidak dapat menjadikan operasi rangkaian tanpa had selesai.

Artikel berkaitan