proxy tekshiruvlari ishlayotganda WinForms'ni bloklashni to'xtating
UI hodisa ishlovchisidagi sinxron Task.WaitAll'ni kutiladigan, cheklangan to'plamlar bilan almashtiring, so'ng nazorat elementlarini tiklangan UI kontekstida yangilang.
WinForms bosish ishlovchisidagi Task.WaitAll, tekshiruvlarning o'zi asinxron HTTP ishlatsa ham oynani bloklaydi. UI oqimi xabarlarni qayta ishlay olmaydi va ushlangan continuation'larga aynan shu bloklangan oqim kerak bo'lishi mumkin.
.NET 6 yoki undan keyingi versiyalar uchun buning o'rniga cheklangan to'plamni kutib turing:
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 va System.Threading.Tasks mavjud bo'lgan mavjud formaga tegishli. CheckProxyAsync cheklangan asinxron kiritish va chiqarishni bajaradi va bitta natija qaytaradi; u fon oqimidan nazorat elementlarini boshqarmaydi. ShowResults va ShowCheckError ilova metodlari.
await ning oddiy continuation'i ishlovchi boshlangan UI kontekstiga qaytadi, shuning uchun ShowResults nazorat elementlarini yangilay oladi. Boshqa oqimda aniq ishlayotgan kod nazorat elementlariga kirishni qo'llab-quvvatlanadigan WinForms mexanizmi orqali uzatishi kerak.
Bepul proxy ro'yxati kirish manzillarini taqdim etishi mumkin; faqat CheckProxyAsync amalga oshiradigan protokollarni uzating. Sakkiz - bu namunaviy byudjet. Keyingi to'plam joriy to'plamdagi eng sekin tekshiruvni kutadi va cheklangan vazifa yaratish evaziga bir oz o'tkazuvchanlikni almashtiradi. Har bir tekshiruvning muddatlarini va bekor qilishni CheckProxyAsync ichida saqlang; to'plamni kutish cheklanmagan tarmoq operatsiyasini tugata olmaydi.