Task.WaitAll katika kishika kitufe cha WinForms huzuia dirisha hata wakati ukaguzi wenyewe hutumia HTTP isiyo ya moja kwa moja. Uzi wa UI hauwezi kuchakata ujumbe, na muendelezo ulionaswa unaweza kuhitaji ule uzi uliozuiwa.

Kwa .NET 6 au zaidi, subiri kundi lenye mipaka badala yake:

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;
    }
}

Hii ni ya fomu iliyopo yenye System.Linq na System.Threading.Tasks zinazopatikana. CheckProxyAsync hufanya uingizaji na utoaji usio wa moja kwa moja wenye mipaka na kurudisha tokeo moja; haiendeshi vidhibiti kutoka uzi wa usuli. ShowResults na ShowCheckError ni mbinu za programu.

Muendelezo wa kawaida wa await hurudi kwenye muktadha wa UI ambapo kishika kilitangulia, kwa hivyo ShowResults inaweza kusasisha vidhibiti. Msimbo unaoendeshwa waziwazi kwenye uzi mwingine lazima upitishe ufikiaji wa vidhibiti kupitia utaratibu unaotumika wa WinForms.

Orodha ya proxy za bure inaweza kutoa anwani za pembejeo; pitisha itifaki zinazotekelezwa na CheckProxyAsync pekee. Nane ni bajeti ya mfano. Kundi lifuatalo husubiri ukaguzi wa polepole zaidi katika kundi la sasa, likibadilisha kasi fulani kwa uundaji wa kazi wenye mipaka. Weka makataa ya kila ukaguzi na kughairi ndani ya CheckProxyAsync; kusubiri kundi hakuwezi kufanya operesheni ya mtandao isiyo na mipaka ikamilike.

Makala zinazohusiana