Hættið að loka WinForms á meðan proxy-prófanir keyra
Skiptið út hliðstæðu Task.WaitAll í UI-atburðarhandfaranum fyrir biðnar, takmarkaðar lotur og uppfærið svo stýringarnar í endurteknu UI-samhenginu.
Task.WaitAll í WinForms-smellhandfara lokar glugganum jafnvel þótt prófanirnar sjálfar noti ósamhliða HTTP. UI-þráðurinn getur ekki unnið úr skilaboðum og handteknar framhaldir gætu þurft sama lokaða þráðinn.
Fyrir .NET 6 eða nýrri, bíðið í staðinn eftir takmarkaðri lotu:
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;
}
}Þetta á heima í fyrirliggjandi formi þar sem System.Linq og System.Threading.Tasks eru tiltæk. CheckProxyAsync framkvæmir takmarkaða ósamhliða I/O og skilar einni niðurstöðu; hún stýrir ekki stýringum frá bakgrunnsþræði. ShowResults og ShowCheckError eru aðferðir forritsins.
Venjulegt await-framhald fer aftur í UI-samhengið þar sem handfarinn byrjaði, svo ShowResults getur uppfært stýringar. Kóði sem keyrir skýrt á öðrum þræði verður að flytja aðgang að stýringum í gegnum studda WinForms-aðferðina.
Listi yfir ókeypis proxy getur veitt innsláttarvistföng; sendið aðeins samskiptareglur sem CheckProxyAsync útfærir. Átta er dæmi um fjárhagsáætlun. Næsta lota bíður eftir hægasta prófuninni í núverandi lotu og skiptir hluta af afköstum fyrir takmarkaða stofnun verkefna. Haldið tímafrestum hverrar prófunar og afbókun inni í CheckProxyAsync; að bíða eftir lotu getur ekki látið ótakmarkaða netaðgerð ljúka.