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 بار بولغان مەۋجۇت form غا تەۋە. CheckProxyAsync چەكلىك asynchronous كىرگۈزۈش ۋە چىقىرىش قىلىپ بىر نەتىجە قايتۇرىدۇ؛ ئۇ ئارقا thread دىن control لارنى باشقۇرمايدۇ. ShowResults ۋە ShowCheckError قوللانما ئۇسۇللىرى.

await نىڭ نورمال continuation ى بىر تەرەپ قىلغۇچى باشلانغان UI context قا قايتىدۇ، شۇڭا ShowResults control لارنى يېڭىلىيالايدۇ. باشقا thread دا ئوچۇق ئىجرا بولۇۋاتقان كود control زىيارىتىنى قوللىنىلغان WinForms مېخانىزمى ئارقىلىق يەتكۈزۈشى كېرەك.

ھەقسىز proxy تىزىملىكى كىرگۈزۈش ئادرېسلىرىنى تەمىنلىيەلەيدۇ؛ پەقەت CheckProxyAsync ئەمەلگە ئاشۇرىدىغان پروتوكوللارنى يەتكۈزۈڭ. سەككىز ئۈلگە بۇدجېت. كېيىنكى گۇرۇپپا نۆۋەتتىكى گۇرۇپپىدىكى ئەڭ ئاستا تەكشۈرۈشنى كۈتىدۇ، چەكلىك task قۇرۇشقا ئالماشتۇرۇپ بىر ئاز throughput نى بېرىدۇ. ھەر بىر تەكشۈرۈشنىڭ مۇددىتى ۋە cancellation نى CheckProxyAsync ئىچىدە ساقلاڭ؛ گۇرۇپپىنى await قىلىش چەكسىز تور مەشغۇلاتىنى تاماملىيالمايدۇ.

مۇناسىۋەتلىك ماقالىلەر