در حال بارگذاری...

چندریسمانی و پردازش موازی

چندریسمانی و پردازش موازی در سی‌شارپ از مفاهیم حیاتی برای توسعه نرم‌افزارهای با عملکرد بالا و پاسخگو است. چندریسمانی به اجرای همزمان چندین رشته (Thread) در یک فرآیند اشاره دارد که باعث می‌شود عملیات طولانی مدت باعث مسدود شدن رابط کاربری نشود و برنامه پاسخگویی بهتری داشته باشد. پردازش موازی، تمرکز بر اجرای همزمان وظایف بر روی هسته‌های متعدد پردازنده دارد و برای پردازش داده‌های حجیم یا عملیات محاسباتی سنگین ایده‌آل است.
در سی‌شارپ، توسعه‌دهندگان می‌توانند از کلاس‌هایی مانند Thread، Task، Task Parallel Library (TPL) و async/await برای اجرای چندریسمانی و پردازش موازی استفاده کنند. استفاده از مکانیزم‌های همزمانی مانند lock، Mutex و Semaphore برای دسترسی ایمن به داده‌های مشترک ضروری است تا از شرایط رقابتی و deadlock جلوگیری شود. ترکیب این تکنیک‌ها با الگوریتم‌های بهینه، ساختار داده مناسب و اصول برنامه‌نویسی شیءگرا امکان ایجاد سیستم‌های مقیاس‌پذیر، مطمئن و با کارایی بالا را فراهم می‌کند.
در این آموزش، شما یاد خواهید گرفت که چگونه وظایف موازی ایجاد کنید، رشته‌ها را مدیریت کنید، استثناها را به درستی کنترل کنید و عملکرد برنامه‌ها را بهینه نمایید. این مهارت‌ها برای توسعه برنامه‌های دسکتاپ، سرویس‌های وب و سیستم‌هایی که نیاز به پردازش همزمان دارند، ضروری است.

مثال پایه

text
TEXT Code
using System;
using System.Threading;
using System.Threading.Tasks;

class Program
{
static void Main()
{
Console.WriteLine("رشته اصلی شروع شد.");

Thread thread = new Thread(DoWork);
thread.Start();

Task task = Task.Run(() =>
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine($"Task در حال اجرا: Iteration {i}");
Thread.Sleep(500);
}
});

for (int i = 0; i < 5; i++)
{
Console.WriteLine($"رشته اصلی: Iteration {i}");
Thread.Sleep(300);
}

thread.Join();
task.Wait();

Console.WriteLine("رشته اصلی خاتمه یافت.");
}

static void DoWork()
{
for (int i = 0; i < 5; i++)
{
Console.WriteLine($"رشته کاری: Iteration {i}");
Thread.Sleep(400);
}
}

}

در این مثال، یک رشته جداگانه برای اجرای متد DoWork ایجاد شده است که همزمان با رشته اصلی اجرا می‌شود. Task.Run برای اجرای یک کار به صورت ناهمزمان استفاده شده است. متدهای Thread.Sleep برای شبیه‌سازی کار طولانی و نمایش اجرای همزمان رشته‌ها کاربرد دارند.
متدهای Join و Wait اطمینان می‌دهند که رشته و Task قبل از پایان برنامه به طور کامل اجرا شوند، که از مشکلات همزمانی و دسترسی نادرست به منابع جلوگیری می‌کند. این مثال پایه، مبانی چندریسمانی و پردازش موازی را برای سناریوهای پیچیده‌تر مانند پردازش داده‌های بزرگ یا انجام محاسبات همزمان فراهم می‌کند.

مثال کاربردی

text
TEXT Code
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

class Program
{
static void Main()
{
Console.WriteLine("شروع پردازش موازی داده‌ها.");

List<int> numbers = Enumerable.Range(1, 20).ToList();

Parallel.ForEach(numbers, number =>
{
int result = number * number;
Console.WriteLine($"عدد: {number}, مربع: {result}, Task ID: {Task.CurrentId}");
});

var evenNumbers = numbers.AsParallel()
.Where(n => n % 2 == 0)
.Select(n => n * 10);

Console.WriteLine("نتایج ضرب اعداد زوج در ۱۰:");
foreach (var num in evenNumbers)
{
Console.WriteLine(num);
}

Console.WriteLine("پردازش موازی خاتمه یافت.");
}

}

این مثال استفاده از Parallel.ForEach را نشان می‌دهد که اجرای عناصر یک مجموعه را به صورت موازی بین چندین رشته تقسیم می‌کند. Task.CurrentId نشان‌دهنده شناسه Task در حال اجراست.
همچنین، PLINQ (Parallel LINQ) اجازه می‌دهد تا کوئری‌های LINQ به صورت موازی اجرا شوند و پردازش داده‌های بزرگ سرعت بگیرد. رعایت بهترین شیوه‌ها شامل کاهش وضعیت مشترک، استفاده از مجموعه‌های thread-safe و بهینه‌سازی بار کاری است. این مفاهیم در سیستم‌های بلادرنگ و برنامه‌های با نیاز به عملکرد بالا کاربردی هستند.

بهترین شیوه‌ها در سی‌شارپ برای چندریسمانی و پردازش موازی شامل استفاده از Task و Parallel به جای Thread مستقیم، کاهش اشتراک وضعیت، استفاده صحیح از مکانیزم‌های همزمانی و مدیریت استثناها با try-catch و AggregateException است.
اشتباهات رایج شامل عدم انتظار برای اتمام رشته‌ها و وظایف، مسدود کردن ThreadPool و الگوریتم‌های ناکارآمد است. بهینه‌سازی عملکرد، جلوگیری از شرایط رقابتی و ایمن‌سازی منابع مشترک از جمله نکات مهم است. امنیت نیز شامل دسترسی صحیح به منابع و حفاظت از بخش‌های بحرانی است.

📊 جدول مرجع

سی‌شارپ Element/Concept Description Usage Example
Thread اجرای مستقل یک رشته Thread t = new Thread(Metod); t.Start();
Task اجرای سطح بالا و ناهمزمان Task.Run(() => Work());
Parallel.ForEach اجرای موازی عناصر مجموعه Parallel.ForEach(numbers, n => Process(n));
PLINQ اجرای موازی کوئری‌های LINQ var result = numbers.AsParallel().Where(n => n % 2 == 0);
lock دسترسی انحصاری به منابع مشترک lock(obj) { /* critical section */ }
CancellationToken قطع cooperative وظایف var cts = new CancellationTokenSource(); Task.Run(() => Work(cts.Token));

چندریسمانی و پردازش موازی عملکرد و پاسخگویی برنامه‌های سی‌شارپ را به طور چشمگیری افزایش می‌دهد. استفاده ایمن از Thread، Task، Parallel و PLINQ همراه با همزمانی صحیح و کاهش اشتراک وضعیت حیاتی است.
برای ادامه، یادگیری async/await، مکانیزم‌های پیشرفته همزمانی و الگوهای طراحی موازی توصیه می‌شود. شروع از ساختارهای سطح بالا و پیشرفت به کنترل دستی رشته‌ها، همراه با تمرین عملی و منابع آموزشی رسمی، بهترین مسیر یادگیری است.

🧠 دانش خود را بیازمایید

آماده شروع

Test Your Knowledge

Test your understanding of this topic with practical questions.

3
سوالات
🎯
70%
برای قبولی
♾️
زمان
🔄
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود