Ne blokold a WinFormsot, miközben a proxy-ellenőrzések futnak
Cserélje le az UI eseménykezelőben lévő szinkron Task.WaitAll hívást várakozó, korlátozott kötegekre, majd frissítse a vezérlőket a folytatott UI-környezetben.
Task.WaitAll egy WinForms kattintáskezelőben blokkolja az ablakot akkor is, ha maguk az ellenőrzések aszinkron HTTP-t használnak. Az UI szál nem tud üzeneteket feldolgozni, és a rögzített folytatásoknak ugyanarra a blokkolt szálra lehet szükségük.
.NET 6 vagy újabb esetén inkább várjon egy korlátozott kötegre:
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;
}
}Ez egy meglévő űrlapba tartozik, ahol System.Linq és System.Threading.Tasks elérhető. A CheckProxyAsync korlátozott aszinkron I/O-t végez, és egy eredményt ad vissza; nem kezel vezérlőket háttérszálból. A ShowResults és a ShowCheckError alkalmazásmetódusok.
A szokásos await folytatás visszatér ahhoz az UI-környezethez, ahol a kezelő elindult, így a ShowResults frissítheti a vezérlőket. A kifejezetten más szálon futó kódnak a vezérlőhozzáférést a támogatott WinForms-mechanizmuson keresztül kell továbbítania.
Az ingyenes proxy lista szolgálhat bemeneti címekkel; csak a CheckProxyAsync által megvalósított protokollokat adja át. A nyolcas egy példa-költségkeret. A következő köteg az aktuális köteg leglassabb ellenőrzésére vár, némi áteresztőképességet cserélve a korlátozott feladatkészítésre. Tartsa meg az egyes ellenőrzések határidejét és a megszakítást a CheckProxyAsync belsejében; egy köteg kivárása nem tud végrehajtani egy korlátlan hálózati műveletet.