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

C#-এ টাস্ক-বেসড প্যারাললিজম (Thread-Based Parallelism)

C#-এ প্যারালল প্রোগ্রামিংয়ের জন্য Task ব্যবহার করা আধুনিক এবং সুপারিশ করা পদ্ধতি। Thread বা ThreadPool-এর চেয়ে Task হালকা, কম্পোজেবল এবং TaskScheduler দিয়ে ম্যানেজড।

Task তৈরি করার পদ্ধতিগুলো

১. Task.Run (সর্বাধিক সাধারণ এবং সুপারিশ করা)

Task task = Task.Run(() => 
{
    // ব্যাকগ্রাউন্ড কাজ
    Console.WriteLine("টাস্ক চলছে...");
});

২. Task.Factory.StartNew

Task task = Task.Factory.StartNew(() => 
{
    Console.WriteLine("ফ্যাক্টরি থেকে শুরু");
});

৩. new Task() + Start()

Task task = new Task(() => PrintMessage());
task.Start();

৪. Lambda এক্সপ্রেশন সহ

Task task = new Task(() => PrintMessage());
task.Start();

সম্পূর্ণ উদাহরণ

using System;
using System.Threading.Tasks;

public class Example
{
    public static void Main()
    {
        // Task.Run ব্যবহার করে শুরু
        Task task = Task.Run(() => 
        {
            int a = 0;
            for (a = 0; a <= 1000; a++) { }
            Console.WriteLine("{0} লুপ ইটারেশন শেষ", a);
        });

        // টাস্ক শেষ হওয়া অপেক্ষা করুন
        task.Wait();
        
        Console.WriteLine("মেইন থ্রেড চালু");
    }
}

আউটপুট

1001 লুপ ইটারেশন শেষ
মেইন থ্রেড চালু

Task.Wait() vs await

পদ্ধতিব্যবহারব্লকিং
task.Wait()সিঙ্ক্রোনাস ব্লকিংহ্যাঁ (মেইন থ্রেড ব্লক হয়)
await taskঅ্যাসিঙ্ক্রোনাস অপেক্ষানা (মেইন থ্রেড মুক্ত)
task.Resultরেজাল্ট পাওয়ার জন্য ব্লকহ্যাঁ

Async/Await প্যাটার্ন (সর্বোত্তম অনুশীলন)

using System;
using System.Threading.Tasks;

public class AsyncExample
{
    public static async Task Main()
    {
        Console.WriteLine("শুরু");
        
        // অ্যাসিঙ্ক্রোনাস অপেক্ষা - মেইন থ্রেড ব্লক হয় না
        await DoWorkAsync();
        
        Console.WriteLine("শেষ");
    }

    static async Task DoWorkAsync()
    {
        await Task.Run(() => 
        {
            // ভারী কাজ
            Thread.Sleep(2000);
        });
        Console.WriteLine("ব্যাকগ্রাউন্ড কাজ সম্পন্ন");
    }
}

Task.WhenAll / WhenAny - একাধিক টাস্ক ম্যানেজমেন্ট

// সমস্ত টাস্ক শেষ হওয়া অপেক্ষা
Task[] tasks = new Task[3];
for (int i = 0; i < 3; i++)
{
    int index = i;
    tasks[i] = Task.Run(() => DoWork(index));
}

await Task.WhenAll(tasks); // সব শেষ হলে চালু
Console.WriteLine("সব টাস্ক সম্পন্ন");

// যেকোনো একটি টাস্ক শেষ হলে চালু
Task completed = await Task.WhenAny(tasks);
Console.WriteLine("কোনো একটি টাস্ক শেষ হয়েছে");

ValueTask - হালকা অপশন

যখন মেথড প্রায়শই সিঙ্ক্রোনাসলি কমপ্লিট হয়, ValueTask<T> অ্যালোকেশন কমাতে সাহায্য করে।

public async ValueTask<int> GetDataAsync()
{
    if (_cache.TryGetValue(key, out int value))
        return value; // সিঙ্ক্রোনাস রিটার্ন, কোনো অ্যালোকেশন নেই
    
    return await FetchFromDbAsync(); // অ্যাসিঙ্ক্রোনাস পথ
}

সাধারণ ভুলগুলো এড়ান

  • .Result বা .Wait() UI থ্রেডে কল করা (ডেডলক হয়) → await ব্যবহার করুন
  • async void মেথড লেখা (এক্সেপশন হ্যান্ডলিং কঠিন) → async Task ব্যবহার করুন
  • ফর লুপে await ব্যবহার করা (সিকোয়েনশিয়াল হয়ে যায়) → Task.WhenAll ব্যবহার করুন
  1. উইন্ডোজ ১০ Task Scheduler সমস্যা সমাধান: সাধারণ এরর দ্রুত ফিক্স

  2. উইন্ডোজ 10-এ টাস্ক এন্ড করার কুইক গাইড: টাস্ক ম্যানেজার সহ বা ব্যতীত

  3. Windows 10-এ প্রসেস টার্মিনেট করার ৩টি প্রমাণিত পদ্ধতি

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