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

C#-তে Task.WhenAll() এবং Task.WaitAll()-এর পার্থক্য কী?

Task.WaitAll বর্তমান থ্রেডকে ব্লক করে রাখে যতক্ষণ না সব টাস্কগুলো এক্সিকিউশন কমপ্লিট হয়। Task.WhenAll মেথডটি একটি টাস্ক তৈরি করতে ব্যবহৃত হয় যা তখন কমপ্লিট হবে যদি এবং কেবল যদি সব অন্যান্য টাস্কগুলো কমপ্লিট হয়।

যদি আমরা `Task.WhenAll` ব্যবহার করি, আমরা একটি টাস্ক অবজেক্ট পাবো যা এখনও কমপ্লিট নয়। কিন্তু এটি ব্লক করবে না বরং প্রোগ্রামটি এক্সিকিউট হতে দেবে। অন্যদিকে, `Task.WaitAll` মেথড কল আসলে ব্লক করে থাকে এবং সব অন্যান্য টাস্ক কমপ্লিট হওয়ার জন্য অপেক্ষা করে।

উদাহরণস্বরূপ বুঝতে চাই: ধরুন আমাদের একটি টাস্ক আছে যা UI থ্রেডের সাথে কিছু অ্যাক্টিভিটি করে, যেমন ইউজার ইন্টারফেসে কিছু অ্যানিমেশন দেখাতে হবে। এখন যদি আমরা `Task.WaitAll` ব্যবহার করি, ইউজার ইন্টারফেস ব্লক হয়ে যাবে এবং সব রিলেটেড টাস্ক কমপ্লিট হওয়া এবং ব্লক রিলিজ হওয়া পর্যন্ত আপডেট হবে না। কিন্তু যদি আমরা একই অ্যাপ্লিকেশনে `Task.WhenAll` ব্যবহার করি, UI থ্রেড ব্লক হবে না এবং স্বাভাবিকভাবে আপডেট হবে।

Task.WhenAll উদাহরণ

উদাহরণ

using System;
using System.Threading.Tasks;

namespace DemoApplication
{
    public class Program
    {
        static void Main(string[] args)
        {
            Task task1 = new Task(() =>
            {
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine("Task 1 - iteration {0}", i);
                    Task.Delay(1000);
                }
                Console.WriteLine("Task 1 complete");
            });

            Task task2 = new Task(() =>
            {
                Console.WriteLine("Task 2 complete");
            });

            task1.Start();
            task2.Start();
            Console.WriteLine("Waiting for tasks to complete.");
            Task.WhenAll(task1, task2);
            Console.WriteLine("Tasks Completed.");
            Console.ReadLine();
        }
    }
}

আউটপুট

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

উপরের উদাহরণে আমরা দেখতে পাচ্ছি যে `Task.WhenAll` ব্যবহার করলে অন্যান্য টাস্কগুলো কমপ্লিট হওয়ার আগেই "Tasks Completed." প্রিন্ট হয়েছে। এর মানে `Task.WhenAll` এক্সিকিউশন ব্লক করে না।

Task.WaitAll উদাহরণ

উদাহরণ

using System;
using System.Threading.Tasks;

namespace DemoApplication
{
    public class Program
    {
        static void Main(string[] args)
        {
            Task task1 = new Task(() =>
            {
                for (int i = 0; i < 5; i++)
                {
                    Console.WriteLine("Task 1 - iteration {0}", i);
                    Task.Delay(1000);
                }
                Console.WriteLine("Task 1 complete");
            });

            Task task2 = new Task(() =>
            {
                Console.WriteLine("Task 2 complete");
            });

            task1.Start();
            task2.Start();
            Console.WriteLine("Waiting for tasks to complete.");
            Task.WaitAll(task1, task2);
            Console.WriteLine("Tasks Completed.");
            Console.ReadLine();
        }
    }
}

আউটপুট

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

উপরের উদাহরণে আমরা দেখতে পাচ্ছি যে `Task.WaitAll` ব্যবহার করলে "Tasks Completed." সব অন্যান্য টাস্ক কমপ্লিট হওয়ার পরেই প্রিন্ট হয়েছে। এর মানে `Task.WaitAll` এক্সিকিউশন ব্লক করে।

  1. DirectX 11 এবং DirectX 12-এর পার্থক্য কী?

  2. C#-এ লিটারেল (Literal) এবং কনস্ট্যান্ট (Constant) এর পার্থক্য

  3. C#-এ String (ক্লাস) এবং string (এলিয়াস) এর পার্থক্য

  4. C#-এ লিস্ট এবং অ্যারেতে পার্থক্য (List vs Array)