Oprește blocarea WinForms cât timp rulează verificările proxy
Înlocuiește un Task.WaitAll sincron din handlerul de eveniment UI cu loturi limitate și așteptate, apoi actualizează controalele în contextul UI reluat.
Task.WaitAll într-un handler de clic WinForms blochează fereastra chiar și când verificările în sine folosesc HTTP asincron. Firul UI nu poate procesa mesaje, iar continuările capturate pot avea nevoie de același fir blocat.
Pentru .NET 6 sau mai nou, așteaptă în schimb un lot limitat:
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;
}
}Acest lucru aparține unui formular existent cu System.Linq și System.Threading.Tasks disponibile. CheckProxyAsync face intrare și ieșire asincronă limitată și returnează un rezultat; nu manipulează controale dintr-un fir de fundal. ShowResults și ShowCheckError sunt metode ale aplicației.
Continuarea normală a await revine în contextul UI în care a început handlerul, deci ShowResults poate actualiza controalele. Codul care rulează explicit pe alt fir trebuie să transmită accesul la controale prin mecanismul WinForms acceptat.
Lista de proxy gratuite poate furniza adrese de intrare; transmite doar protocoalele implementate de CheckProxyAsync. Opt este un buget exemplu. Următorul lot așteaptă cea mai lentă verificare din lotul curent, schimbând ceva debit pentru crearea limitată de sarcini. Păstrează termenele fiecărei verificări și anularea în CheckProxyAsync; așteptarea unui lot nu poate face o operație de rețea nelimitată să se termine.