Ndal bllokimin e WinForms ndërsa kontrollet e proxy po ekzekutohen
Zëvendëso Task.WaitAll sinkron në trajtuesin e ngjarjes UI me tufa të kufizuara dhe të pritura, pastaj përditëso kontrollet në kontekstin UI të rifilluar.
Task.WaitAll në një trajtues klikimi WinForms bllokon dritaren edhe kur vetë kontrollet përdorin HTTP asinkron. Fija UI nuk mund të përpunojë mesazhe, dhe vazhdimet e kapura mund të kenë nevojë për të njëjtën fije të bllokuar.
Për .NET 6 ose më vonë, prit një tufë të kufizuar në vend të kësaj:
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;
}
}Kjo i përket një formulari ekzistues me System.Linq dhe System.Threading.Tasks të disponueshme. CheckProxyAsync kryen hyrje dhe dalje asinkrone të kufizuar dhe kthen një rezultat; nuk manipulon kontrolle nga një fije sfondi. ShowResults dhe ShowCheckError janë metoda aplikacioni.
Vazhdimi normal i await kthehet në kontekstin UI ku filloi trajtuesi, kështu që ShowResults mund të përditësojë kontrollet. Kodi që ekzekutohet në mënyrë eksplicite në një fije tjetër duhet të transmetojë aksesin e kontrolleve përmes mekanizmit të mbështetur të WinForms.
Lista e proxy falas mund të furnizojë adresa hyrëse; kaloni vetëm protokollet e implementuara nga CheckProxyAsync. Tetë është një buxhet shembull. Tufa tjetër pret kontrollin më të ngadaltë në tufën aktuale, duke shkëmbyer pak xhiro për krijim të kufizuar detyrash. Mbaj afatet e çdo kontrolli dhe anulimin brenda CheckProxyAsync; pritja e një tufe nuk mund ta përfundojë një operacion rrjeti të pakufizuar.