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-ի ներսում. խմբաքանակին սպասելը չի կարող ավարտել անսահմանափակ ցանցային գործողությունը։

Առնչվող հոդվածներ