ໃນ WinForms click handler, Task.WaitAll ບລັອກໜ້າຕ່າງເຖິງແມ່ນວ່າການກວດສອບເອງໃຊ້ HTTP ແບບ asynchronous. UI thread ບໍ່ສາມາດປະມວນຜົນຂໍ້ຄວາມໄດ້, ແລະ continuation ທີ່ຖືກຈັບໄວ້ອາດຕ້ອງການ thread ດຽວກັນທີ່ຖືກບລັອກນັ້ນ.

ສຳລັບ .NET 6 ຫຼືສູງກວ່າ, ໃຫ້ await batch ທີ່ມີຂອບເຂດແທນ:

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

ສິ່ງນີ້ຢູ່ໃນ form ທີ່ມີຢູ່ແລ້ວໂດຍມີ System.Linq ແລະ System.Threading.Tasks ພ້ອມ. CheckProxyAsync ເຮັດ I/O ແບບ asynchronous ທີ່ມີຂອບເຂດ ແລະສົ່ງຄືນໜຶ່ງຜົນ; ມັນບໍ່ໄດ້ຈັດການ control ຈາກ background thread. ShowResults ແລະ ShowCheckError ແມ່ນ method ຂອງ application.

continuation ປົກກະຕິຂອງ await ກັບໄປ UI context ບ່ອນທີ່ handler ເລີ່ມ, ດັ່ງນັ້ນ ShowResults ສາມາດອັບເດດ control ໄດ້. ໂຄ້ດທີ່ແລ່ນຢູ່ thread ອື່ນຢ່າງຊັດເຈນຕ້ອງສົ່ງການເຂົ້າເຖິງ control ຜ່ານກົນໄກ WinForms ທີ່ຮອງຮັບ.

ລາຍຊື່ free proxy list ສາມາດໃຫ້ທີ່ຢູ່ input; ສົ່ງສະເພາະ protocol ທີ່ CheckProxyAsync ຮອງຮັບ. ແປດແມ່ນງົບປະມານຕົວຢ່າງ. batch ຕໍ່ໄປລໍຖ້າການກວດສອບທີ່ຊ້າທີ່ສຸດໃນ batch ປັດຈຸບັນ, ແລກກັບ throughput ບາງສ່ວນເພື່ອການສ້າງ task ທີ່ມີຂອບເຂດ. ເກັບ deadline ຂອງແຕ່ລະການກວດສອບ ແລະ cancellation ໄວ້ໃນ CheckProxyAsync; ການ await batch ບໍ່ສາມາດເຮັດໃຫ້ network operation ທີ່ບໍ່ມີຂອບເຂດສຳເລັດໄດ້.

ບົດຄວາມທີ່ກ່ຽວຂ້ອງ