WinForms క్లిక్ హ్యాండ్లర్లో Task.WaitAll విండోను బ్లాక్ చేస్తుంది, తనిఖీలు స్వయంగా asynchronous HTTP ఉపయోగించినప్పటికీ. UI thread సందేశాలను ప్రాసెస్ చేయలేదు, మరియు సంగ్రహించిన continuationలకు అదే బ్లాక్ చేయబడిన thread అవసరం కావచ్చు.

.NET 6 లేదా తర్వాతి వాటికి, బదులుగా పరిమిత బ్యాచ్ను await చేయండి:

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

ఇది System.Linq మరియు System.Threading.Tasks అందుబాటులో ఉన్న ఇప్పటికే ఉన్న ఫారమ్కు చెందుతుంది. CheckProxyAsync పరిమిత asynchronous ఇన్పుట్ మరియు అవుట్పుట్ చేసి ఒక ఫలితాన్ని తిరిగి ఇస్తుంది; ఇది background thread నుండి controlsను నిర్వహించదు. ShowResults మరియు ShowCheckError అప్లికేషన్ పద్ధతులు.

await యొక్క సాధారణ continuation హ్యాండ్లర్ ప్రారంభమైన UI contextకు తిరిగి వస్తుంది, కాబట్టి ShowResults controlsను నవీకరించగలదు. మరొక threadలో స్పష్టంగా నడుస్తున్న code, మద్దతు ఉన్న WinForms మెకానిజం ద్వారా control యాక్సెస్ను పంపాలి.

ఉచిత proxy జాబితా ఇన్పుట్ చిరునామాలను అందించగలదు; CheckProxyAsync అమలు చేసే ప్రోటోకాల్లను మాత్రమే పంపండి. ఎనిమిది ఒక ఉదాహరణ బడ్జెట్. తదుపరి బ్యాచ్ ప్రస్తుత బ్యాచ్లోని నెమ్మదైన తనిఖీ కోసం వేచి ఉంటుంది, పరిమిత task సృష్టి కోసం కొంత throughputను మార్పిడి చేస్తుంది. ప్రతి తనిఖీ గడువులను మరియు cancellationను CheckProxyAsync లోపల ఉంచండి; బ్యాచ్ను await చేయడం అపరిమిత నెట్వర్క్ ఆపరేషన్ను పూర్తి చేయించలేదు.

సంబంధిత వ్యాసాలు