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 ଉପଲବ୍ଧ ଥିବା ଏକ ବିଦ୍ୟମାନ ଫର୍ମରେ ଅନ୍ତର୍ଭୁକ୍ତ। CheckProxyAsync ସୀମିତ asynchronous ଇନପୁଟ୍ ଏବଂ ଆଉଟପୁଟ୍ କରେ ଏବଂ ଗୋଟିଏ ଫଳାଫଳ ଫେରାଏ; ଏହା background thread ରୁ controls ପରିଚାଳନା କରେ ନାହିଁ। ShowResults ଏବଂ ShowCheckError ଆପ୍ଲିକେସନ୍ ପଦ୍ଧତି।

await ର ସାଧାରଣ continuation ହ୍ୟାଣ୍ଡଲର ଆରମ୍ଭ ହୋଇଥିବା UI context କୁ ଫେରେ, ତେଣୁ ShowResults controls ଅଦ୍ୟତନ କରିପାରେ। ଅନ୍ୟ thread ରେ ସ୍ପଷ୍ଟ ଭାବରେ ଚାଲୁଥିବା code ନିଶ୍ଚିତ ଭାବରେ ସମର୍ଥିତ WinForms ଯନ୍ତ୍ରକୌଶଳ ମାଧ୍ୟମରେ control ପ୍ରବେଶ ପଠାଇବ।

ମାଗଣା proxy ତାଲିକା ଇନପୁଟ୍ ଠିକଣା ଯୋଗାଇପାରେ; CheckProxyAsync କାର୍ଯ୍ୟକାରୀ କରୁଥିବା ପ୍ରୋଟୋକଲ୍ କେବଳ ପଠାନ୍ତୁ। ଆଠ ଏକ ଉଦାହରଣ ବଜେଟ୍। ପରବର୍ତ୍ତୀ ବ୍ୟାଚ୍ ବର୍ତ୍ତମାନ ବ୍ୟାଚ୍ ର ସର୍ବାଧିକ ଧୀର ଯାଞ୍ଚକୁ ଅପେକ୍ଷା କରେ, ସୀମିତ task ସୃଷ୍ଟି ପାଇଁ କିଛି throughput ବଦଳାଇ। ପ୍ରତ୍ୟେକ ଯାଞ୍ଚର ସମୟସୀମା ଏବଂ cancellation CheckProxyAsync ଭିତରେ ରଖନ୍ତୁ; ଏକ ବ୍ୟାଚ୍ await କରିବା ଅସୀମିତ ନେଟୱାର୍କ ଅପରେସନ୍ ସମ୍ପୂର୍ଣ୍ଣ କରିପାରିବ ନାହିଁ।

ସମ୍ପର୍କିତ ପ୍ରବନ୍ଧ