Prenehajte blokirati WinForms, medtem ko potekajo preverjanja proxy
Zamenjajte sinhroni Task.WaitAll v obravnavi dogodka UI s pričakovanimi omejenimi paketi in nato posodobite kontrolnike v nadaljevanem kontekstu UI.
Task.WaitAll v obravnavi klika WinForms blokira okno, tudi ko preverjanja sama uporabljajo asinhroni HTTP. Nit UI ne more obdelovati sporočil, zajeta nadaljevanja pa lahko potrebujejo isto blokirano nit.
Za .NET 6 ali novejši namesto tega počakajte omejen paket:
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;
}
}To spada v obstoječi obrazec z razpoložljivima System.Linq in System.Threading.Tasks. CheckProxyAsync izvaja omejen asinhroni vhod in izhod ter vrne en rezultat; ne upravlja kontrolnikov iz niti v ozadju. ShowResults in ShowCheckError sta metodi aplikacije.
Običajno nadaljevanje await se vrne v kontekst UI, kjer se je obravnava začela, zato lahko ShowResults posodobi kontrolnike. Koda, ki se izrecno izvaja v drugi niti, mora dostop do kontrolnikov posredovati prek podprtega mehanizma WinForms.
Seznam brezplačnih proxy lahko zagotovi vhodne naslove; posredujte samo protokole, ki jih izvaja CheckProxyAsync. Osem je primer proračuna. Naslednji paket čaka na najpočasnejše preverjanje v trenutnem paketu in zamenja nekaj prepustnosti za omejeno ustvarjanje opravil. Ohranite roke vsakega preverjanja in preklic v CheckProxyAsync; čakanje na paket ne more dokončati neomejene omrežne operacije.