Berhenti Memblokir WinForms Saat Pemeriksaan Proxy Berjalan
Ganti Task.WaitAll sinkron di penangan peristiwa UI dengan kumpulan terbatas yang ditunggu, lalu perbarui kontrol pada konteks UI yang dilanjutkan.
Task.WaitAll di penangan klik WinForms memblokir jendela bahkan ketika pemeriksaannya sendiri memakai HTTP asinkron. Thread UI tidak dapat memproses pesan, dan kelanjutan yang tertangkap mungkin memerlukan thread terblokir yang sama.
Pada .NET 6 atau lebih baru, tunggu kumpulan terbatas 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 cocok untuk formulir yang sudah ada dengan System.Linq dan System.Threading.Tasks tersedia. CheckProxyAsync melakukan I/O asinkron terbatas dan mengembalikan satu hasil; ia tidak memanipulasi kontrol dari thread latar belakang. ShowResults dan ShowCheckError adalah metode aplikasi.
Kelanjutan await normal kembali ke konteks UI tempat penangan dimulai, sehingga ShowResults dapat memperbarui kontrol. Kode yang secara eksplisit berjalan di thread lain harus meneruskan akses kontrol melalui mekanisme WinForms yang didukung.
Daftar proxy gratis dapat menyediakan alamat masukan; teruskan hanya protokol yang diimplementasikan CheckProxyAsync. Delapan adalah contoh anggaran. Kumpulan berikutnya menunggu pemeriksaan terlambat di kumpulan saat ini, menukar sebagian throughput dengan pembuatan tugas terbatas. Pertahankan tenggat setiap pemeriksaan dan pembatalan di CheckProxyAsync; menunggu kumpulan tidak dapat membuat operasi jaringan tak terbatas selesai.