কম্পিউটার টিউটোরিয়াল

C#-এ একাধিক Async টাস্ক রান করা এবং সকল hoànস হতে অপেক্ষা করা (Task.WaitAll vs Task.WhenAll)

Task.WaitAll করেন্ট থ্রেড ব্লক করে যতক্ষণ না সকল টাস্ক এক্সিকিউশন কমপ্লিট হয়।

Task.WhenAll একটি টাস্ক তৈরি করে যা তখন কমপ্লিট হবে যখন সকল অপর টাস্ক কমপ্লিট হবে। এটি থ্রেড ব্লক করে না (non-blocking)।

উদাহরণ ১: Task.WhenAll (Non-blocking)

static void Main(string[] args)
{
    Task task1 = new Task(() =>
    {
        for (var i = 0; i < 5; i++)
        {
            Console.WriteLine("Task 1 - iteration {0}", i);
            Task.Delay(1000);
        }
        Console.WriteLine("Task 1 complete");
    });
    Task task2 = new Task(() =>
    {
        for (var i = 0; i < 5; i++)
        {
            Console.WriteLine("Task 2 - iteration {0}", i);
            Task.Delay(1000);
        }
        Console.WriteLine("Task 2 complete");
    });
    task1.Start();
    task2.Start();
    Console.WriteLine("Waiting for tasks to complete.");
    Task.WhenAll(task1, task2); // await না করলে মেইন থ্রেড অপেক্ষা করবে না
    Console.WriteLine("Both Tasks Completed.");
    Console.ReadLine();
}

আউটপুট

Waiting for tasks to complete.
Both Tasks Completed.
Task 1 - iteration 0
Task 2 - iteration 0
Task 2 - iteration 1
Task 2 - iteration 2
Task 2 - iteration 3
Task 1 - iteration 1
Task 1 - iteration 2
Task 1 - iteration 3
Task 1 - iteration 4
Task 1 complete
Task 2 - iteration 4
Task 2 complete

নোট: Task.WhenAll কল করার পর await না করলে মেইন থ্রেড টাস্কগুলোর শেষ হওয়ার জন্য অপেক্ষা করে না। সঠিক ব্যবহার: await Task.WhenAll(task1, task2);।

উদাহরণ ২: Task.WaitAll (Blocking)

static void Main(string[] args)
{
    Task task1 = new Task(() =>
    {
        for (var i = 0; i < 5; i++)
        {
            Console.WriteLine("Task 1 - iteration {0}", i);
            Task.Delay(1000);
        }
        Console.WriteLine("Task 1 complete");
    });
    Task task2 = new Task(() =>
    {
        for (var i = 0; i < 5; i++)
        {
            Console.WriteLine("Task 2 - iteration {0}", i);
            Task.Delay(1000);
        }
        Console.WriteLine("Task 2 complete");
    });
    task1.Start();
    task2.Start();
    Console.WriteLine("Waiting for tasks to complete.");
    Task.WaitAll(task1, task2); // ব্লক করে
    Console.WriteLine("Both Tasks Completed.");
    Console.ReadLine();
}

আউটপুট

Waiting for tasks to complete.
Task 1 - iteration 0
Task 2 - iteration 0
Task 1 - iteration 1
Task 1 - iteration 2
Task 1 - iteration 3
Task 1 - iteration 4
Task 1 complete
Task 2 - iteration 1
Task 2 - iteration 2
Task 2 - iteration 3
Task 2 - iteration 4
Task 2 complete
Both Tasks Completed

সারসংক্ষেপ: অ্যাসিনক্রোনাস কনটেক্সটে await Task.WhenAll ব্যবহার করুন (non-blocking)। সিনক্রোনাস কনটেক্সটে Task.WaitAll ব্যবহার করা যায় (blocking)।

  1. উইন্ডোজ ১০-এ হিডেন ফাইলস মাস্টার করুন: কীভাবে সহজে লুকানো এবং দেখানো যায়

  2. Android-এ সহজে একাধিক Facebook অ্যাকাউন্ট ম্যানেজ করুন: সম্পূর্ণ সেটআপ গাইড

  3. জিমেইল টাস্কস মাস্টার করুন: টু-ডু লিস্ট তৈরি, সংগঠিত এবং পরিচালনা করুন

  4. Windows Task Automation মাস্টার করুন: ধাপে ধাপে গাইড