Task.WaitAll WinForms ক্লিক হ্যান্ডলারে উইন্ডো ব্লক করে, এমনকি যখন পরীক্ষাগুলো নিজেরাই 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 I/O করে এবং একটি ফলাফল ফেরত দেয়; এটি ব্যাকগ্রাউন্ড থ্রেড থেকে কন্ট্রোল পরিচালনা করে না। ShowResults এবং ShowCheckError অ্যাপ্লিকেশন মেথড।

সাধারণ await continuation যে UI প্রসঙ্গে হ্যান্ডলার শুরু হয়েছিল সেখানে ফিরে আসে, তাই ShowResults কন্ট্রোল আপডেট করতে পারে। অন্য থ্রেডে স্পষ্টভাবে চলা কোডকে সমর্থিত WinForms পদ্ধতির মাধ্যমে কন্ট্রোল অ্যাক্সেস পাঠাতে হবে।

বিনামূল্যের প্রক্সি তালিকা ইনপুট ঠিকানা সরবরাহ করতে পারে; শুধু CheckProxyAsync দ্বারা বাস্তবায়িত প্রোটোকল পাঠান। আট একটি উদাহরণ বাজেট। পরবর্তী ব্যাচ বর্তমান ব্যাচের সবচেয়ে ধীর পরীক্ষার জন্য অপেক্ষা করে, যা কিছু থ্রুপুট সীমিত টাস্ক তৈরির বিনিময়ে দেয়। প্রতিটি পরীক্ষার সময়সীমা এবং বাতিলকরণ CheckProxyAsync-এ রাখুন; একটি ব্যাচের জন্য অপেক্ষা করা অসীম নেটওয়ার্ক অপারেশন শেষ করাতে পারে না।

সম্পর্কিত নিবন্ধ