WinForms-ийн click handler дахь Task.WaitAll нь шалгалтууд өөрсдөө асинхрон 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 нь хязгаарлагдмал асинхрон оролт гаралт хийж нэг үр дүн буцаана; тэр background thread-ээс control-уудыг удирдахгүй. ShowResults болон ShowCheckError нь application-ийн метод юм.

await-ийн ердийн continuation нь handler эхэлсэн UI context руу буцаж ирдэг тул ShowResults control-уудыг шинэчилж чадна. Өөр thread дээр тодорхой ажиллаж буй код нь control-ийн хандалтыг дэмжигдсэн WinForms механизмаар дамжуулах ёстой.

Үнэгүй proxy жагсаалт нь оролтын хаяг өгч чадна; зөвхөн CheckProxyAsync хэрэгжүүлдэг протоколуудыг дамжуул. Найм бол жишээ төсөв. Дараагийн багц нь одоогийн багцын хамгийн удаан шалгалтыг хүлээж, бага зэрэг throughput-ыг хязгаарлагдмал task үүсгэлтээр солилцдог. Шалгалт бүрийн хугацааны хязгаар болон cancellation-ыг CheckProxyAsync дотор байлга; багцыг await хийх нь хязгааргүй сүлжээний үйлдлийг дуусгаж чадахгүй.

Холбоотой нийтлэлүүд