WinForms کلک ہینڈلر میں Task.WaitAll ونڈو کو بلاک کرتا ہے، چاہے جانچیں خود asynchronous HTTP استعمال کریں۔ UI تھریڈ پیغامات پر کارروائی نہیں کر سکتا، اور پکڑے گئے continuation کو وہی بلاک شدہ تھریڈ درکار ہو سکتا ہے۔

.NET 6 یا بعد کے لیے، اس کے بجائے ایک محدود بیچ کا انتظار کریں:

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 تھریڈ سے controls نہیں چلاتا۔ ShowResults اور ShowCheckError ایپلیکیشن کے طریقے ہیں۔

await کا معمول کا continuation اسی UI context میں واپس آتا ہے جہاں ہینڈلر شروع ہوا تھا، اس لیے ShowResults controls اپ ڈیٹ کر سکتا ہے۔ دوسرے تھریڈ پر واضح طور پر چلنے والے کوڈ کو control رسائی معاون WinForms میکانزم کے ذریعے بھیجنی ہوگی۔

مفت proxy فہرست ان پٹ پتے فراہم کر سکتی ہے؛ صرف وہی پروٹوکول بھیجیں جو CheckProxyAsync نافذ کرتا ہے۔ آٹھ ایک مثال بجٹ ہے۔ اگلا بیچ موجودہ بیچ کی سب سے سست جانچ کا انتظار کرتا ہے، محدود task تخلیق کے لیے کچھ throughput بدلتا ہے۔ ہر جانچ کی آخری تاریخوں اور cancellation کو CheckProxyAsync میں رکھیں؛ بیچ کا انتظار غیر محدود نیٹ ورک آپریشن کو مکمل نہیں کرا سکتا۔

متعلقہ مضامین