WinForms click handler ရှိ 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 input/output ကို လုပ်ဆောင်ပြီး ရလဒ်တစ်ခု ပြန်ပေးသည်။ ၎င်းသည် background thread မှ control များကို မကိုင်တွယ်ပါ။ ShowResults နှင့် ShowCheckError သည် application method များဖြစ်သည်။

ပုံမှန် await continuation သည် handler စတင်ခဲ့သည့် UI context သို့ ပြန်လာသည်၊ ထို့ကြောင့် ShowResults သည် control များကို အပ်ဒိတ်လုပ်နိုင်သည်။ အခြား thread တွင် ရှင်းလင်းစွာ လုပ်ဆောင်နေသော code သည် control ဝင်ရောက်မှုကို ပံ့ပိုးထားသော WinForms ယန္တရားမှတစ်ဆင့် ပို့ပေးရမည်။

အခမဲ့ proxy စာရင်း သည် input လိပ်စာများ ပေးနိုင်သည်။ CheckProxyAsync အကောင်အထည်ဖော်ထားသော protocol များကိုသာ ပို့ပါ။ ရှစ်ခုသည် ဥပမာ ဘတ်ဂျက်ဖြစ်သည်။ နောက်အသုတ်သည် လက်ရှိအသုတ်ရှိ အနှေးဆုံးစစ်ဆေးမှုကို စောင့်ပြီး ကန့်သတ်ထားသော task ဖန်တီးမှုအတွက် throughput အနည်းငယ်ကို လဲလှယ်သည်။ စစ်ဆေးမှုတစ်ခုစီ၏ သတ်မှတ်ချိန်များနှင့် cancellation ကို CheckProxyAsync အတွင်း ထားရှိပါ။ အသုတ်တစ်ခုကို await လုပ်ခြင်းသည် ကန့်သတ်မရှိသော network လုပ်ဆောင်မှုကို အပြီးသတ်စေနိုင်မည် မဟုတ်ပါ။

ဆက်စပ်ဆောင်းပါးများ