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ব্যবহার করুন