Task.WaitAll በWinForms ጠቅታ አስተናጋጅ ውስጥ ምርመራዎቹ ራሳቸው አሲንክሮን HTTP ቢጠቀሙም መስኮቱን ያግዳል። የUI ክር መልእክቶችን ማካሄድ አይችልም፣ የተያዙ ቀጣዮች ደግሞ ያው የተገደበውን ክር ሊፈልጉ ይችላሉ።

ለ.NET 6 ወይም ከዚያ በላይ፣ በምትኩ የተወሰነ ባች ይጠብቁ፦

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 የተወሰነ አሲንክሮን I/O ያከናውንና አንድ ውጤት ይመልሳል፤ ከበስተጀርባ ክር ላይ መቆጣጠሪያዎችን አይጠቀምም። ShowResults እና ShowCheckError የመተግበሪያ ዘዴዎች ናቸው።

መደበኛው የawait ቀጣይ አስተናጋጁ ወደጀመረበት የUI አውድ ይመለሳል፣ ስለዚህ ShowResults መቆጣጠሪያዎችን ማዘመን ይችላል። በሌላ ክር ላይ በግልጽ የሚሮጥ ኮድ የመቆጣጠሪያ መዳረሻን በሚደገፈው የWinForms ዘዴ ማስተላለፍ አለበት።

ነፃ የፕሮክሲ ዝርዝሩ የግቤት አድራሻዎችን ሊያቀርብ ይችላል፤ CheckProxyAsync የሚተገብራቸውን ፕሮቶኮሎች ብቻ ያስተላልፉ። ስምንት ምሳሌያዊ በጀት ነው። ቀጣዩ ባች በአሁኑ ባች ውስጥ በጣም ቀርፋፋውን ምርመራ ይጠብቃል፣ ይህም የተወሰነ የተግባር ፍጠራን ለማረጋገጥ የተወሰነ ፍሰትን ይለውጣል። የእያንዳንዱን ምርመራ የጊዜ ገደቦች እና ስረዛ በCheckProxyAsync ውስጥ ያቆዩ፤ ባችን መጠበቅ ያልተገደበ የኔትወርክ ስራ እንዲጠናቀቅ ማድረግ አይችልም።

ተዛማጅ ጽሑፎች