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.

Artikuj të ngjashëm