Proxy шалгалт ажиллаж байх үед WinForms-ийг блоклохоо зогсоо
UI-ийн event handler дахь синхрон Task.WaitAll-ийг хүлээгддэг, хязгаарлагдмал багцаар сольж, дараа нь сэргэсэн UI context дээр control-уудыг шинэчил.
WinForms-ийн click handler дахь Task.WaitAll нь шалгалтууд өөрсдөө асинхрон HTTP ашиглаж байсан ч цонхыг блоклодог. UI thread нь мессеж боловсруулж чадахгүй, барьсан continuation-уудад тэр блоклогдсон thread хэрэгтэй байж болно.
.NET 6 буюу түүнээс хойшхи хувилбарт оронд нь хязгаарлагдмал багцыг await хийнэ:
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;
}
}Энэ нь System.Linq болон System.Threading.Tasks бэлэн байгаа одоо байгаа form-д хамаарна. CheckProxyAsync нь хязгаарлагдмал асинхрон оролт гаралт хийж нэг үр дүн буцаана; тэр background thread-ээс control-уудыг удирдахгүй. ShowResults болон ShowCheckError нь application-ийн метод юм.
await-ийн ердийн continuation нь handler эхэлсэн UI context руу буцаж ирдэг тул ShowResults control-уудыг шинэчилж чадна. Өөр thread дээр тодорхой ажиллаж буй код нь control-ийн хандалтыг дэмжигдсэн WinForms механизмаар дамжуулах ёстой.
Үнэгүй proxy жагсаалт нь оролтын хаяг өгч чадна; зөвхөн CheckProxyAsync хэрэгжүүлдэг протоколуудыг дамжуул. Найм бол жишээ төсөв. Дараагийн багц нь одоогийн багцын хамгийн удаан шалгалтыг хүлээж, бага зэрэг throughput-ыг хязгаарлагдмал task үүсгэлтээр солилцдог. Шалгалт бүрийн хугацааны хязгаар болон cancellation-ыг CheckProxyAsync дотор байлга; багцыг await хийх нь хязгааргүй сүлжээний үйлдлийг дуусгаж чадахгүй.