آشنایی با Multi-Threaded  در سی شارپ

تیم تحریریه 1403/12/22 0 16
لینک کوتاه https://zoheirsoftware.com/z/eb5ee43b0 |
آشنایی با Multi-Threaded ,مزایای استفاده از Multi-Threading,چالش‌ها و مشکلات در Multi-Threading

آشنایی با Multi-Threaded  در سی شارپ

Multi-Threaded برنامه‌نویسی در سی‌شارپ به روشی اطلاق می‌شود که در آن چندین Thread به طور همزمان در یک برنامه اجرا می‌شوند.

این قابلیت به برنامه‌ها امکان می‌دهد که چندین عملیات را به صورت همزمان انجام دهند و بدین ترتیب کارایی و سرعت برنامه افزایش یابد.

با استفاده از Multi-Threading، می‌توان کارهای مختلفی مثل پردازش‌های طولانی‌مدت، ورودی/خروجی، یا حتی تعاملات با کاربر را در پس‌زمینه انجام داد، بدون اینکه روی عملکرد سایر قسمت‌های برنامه تاثیر بگذارد.

این امر به ویژه در برنامه‌های با بار پردازشی بالا، مانند بازی‌ها یا نرم‌افزارهای پردازش تصویر، اهمیت زیادی دارد.

در سی‌شارپ، استفاده از Thread برای مدیریت چندین وظیفه به طور همزمان بسیار ساده است.

کلاس‌هایی مانند Thread و Task ابزارهایی برای مدیریت و ایجاد Thread های مختلف فراهم می‌کنند.

همچنین، Synchronization در Multi-Threading برای جلوگیری از مشکلاتی مانند Data Race و Deadlock ضروری است.

سی‌شارپ با استفاده از ابزارهایی مانند lock، Monitor، و Mutex به توسعه‌دهندگان این امکان را می‌دهد که دسترسی به داده‌های مشترک در میان Thread ها را به درستی مدیریت کنند و از بروز مشکلات ناشی از هم‌زمانی جلوگیری نمایند.

 

آشنایی با Multi-Threaded  در سی شارپ

 

 

 ساختار Thread در سی‌شارپ 

برای استفاده از Thread در سی‌شارپ، ابتدا باید متدی را تعریف کنیم که قرار است توسط Thread اجرا شود

 سپس یک شیء از کلاس Thread ایجاد کرده و متد مورد نظر را به آن اختصاص می‌دهیم.

در نهایت با استفاده از متد Start()، Thread را اجرا می‌کنیم.

مثال

در این مثال، یک برنامه ساده با دو Thread ایجاد می‌کنیم که هرکدام پیامی را چاپ می‌کنند.

using System;
using System.Threading;

class Program
{
    static void PrintMessage(object threadId)
    {
        Console.WriteLine($"Thread {threadId} is running.");
    }

    static void Main()
    {
        // ایجاد و شروع 2 Thread
        Thread t1 = new Thread(PrintMessage);
        Thread t2 = new Thread(PrintMessage);

        t1.Start(1); // ارسال شناسه برای اولین Thread
        t2.Start(2); // ارسال شناسه برای دومین Thread

        Console.WriteLine("Main thread is running.");
        
        t1.Join(); // منتظر می‌مانیم تا Thread اول تمام شود
        t2.Join(); // منتظر می‌مانیم تا Thread دوم تمام شود
    }
}


در این برنامه

  • دو Thread مختلف ایجاد می‌شود که هریک متد PrintMessage را اجرا می‌کنند.

  • با استفاده از متد Start()، Thread ها آغاز می‌شوند.

  • با استفاده از ()Join، برنامه اصلی منتظر می‌ماند تا Thread‌ها تمام شوند.

 

 

 

آیا به دنبال یک فرصت عالی برای یادگیری برنامه‌نویسی هستید؟ 🚀

با دوره آموزشی سی‌شارپ ما، شما می‌توانید مهارت‌های خود را به سطح جدیدی ارتقا دهید! این دوره به‌طور کامل طراحی شده تا به شما کمک کند تا از مبتدی تا پیشرفته در دنیای برنامه‌نویسی سی‌شارپ پیش بروید.

👨‍🏫 چرا دوره ما را انتخاب کنید؟

  • محتوای جامع و عملی: با پروژه‌های واقعی و تمرینات عملی، یادگیری را به تجربه‌ای جذاب تبدیل کنید.
  • مدرس مجرب: از تجربه و دانش مدرس حرفه‌ای بهره‌مند شوید که شما را در هر مرحله از یادگیری راهنمایی می‌کنند.
  • پشتیبانی ۲۴/۷: هر زمان که سوالی داشتید، ما در کنار شما خواهیم بود تا به شما کمک کنیم.
  • دسترسی مادام‌العمر: به محتوای دوره دسترسی دائمی داشته باشید و هر زمان که خواستید، می‌توانید به آن مراجعه کنید.

💡 فرصت را از دست ندهید!

بایادگیری سی‌شارپ، می‌توانید در دنیای فناوری اطلاعات به یک متخصص تبدیل شوید و در پروژه‌های جذاب و چالش‌برانگیز شرکت کنید.

همین امروز به جمع یادگیرندگان ما بپیوندید و اولین قدم را به سوی آینده‌ای روشن‌تر بردارید!

شرکت در دوره آموزش برنامه نویسی سی شارپ

 

 

مزایای استفاده از Multi-Threading

  • افزایش کارایی

    با اجرای چندین Thread به طور هم‌زمان، می‌توان کارهای مختلف را به سرعت انجام داد. به این ترتیب، زمان اجرای کلی برنامه کاهش می‌یابد.
  • پردازش موازی

    در برنامه‌های Multi-Threaded، می‌توان پردازش‌ها را به صورت موازی انجام داد.
    برای مثال، در یک برنامه پردازش تصویر، هر Thread می‌تواند بخشی از تصویر را پردازش کند، که این کار باعث افزایش سرعت می‌شود.
  • بهبود تجربه کاربری

    در برنامه‌های UI، استفاده از Multi-Threading می‌تواند موجب بهبود تجربه کاربری شود.
    به عنوان مثال، در یک برنامه دسکتاپ، می‌توان پردازش‌های طولانی‌مدت را در یک Thread پس‌زمینه انجام داد تا رابط کاربری (UI) همچنان پاسخگو بماند.
  • اجرای همزمان عملیات ورودی/خروجی

    در برنامه‌های شبکه‌ای یا برنامه‌هایی که نیاز به خواندن و نوشتن داده‌ها دارند، می‌توان از Multi-Threading برای انجام عملیات ورودی/خروجی به صورت هم‌زمان استفاده کرد.

 

مزایای استفاده از Multi-Threading

 

چالش‌ها و مشکلات در Multi-Threading

  • هم‌زمانی (Synchronization)

    یکی از بزرگ‌ترین چالش‌ها در برنامه‌های Multi-Threaded، هم‌زمانی است.
    زمانی که چند Thread به منابع مشترک دسترسی دارند، مشکلاتی مانند Data Race یا Deadlock ممکن است بوجود آید.
    برای جلوگیری از این مشکلات باید از ابزارهای هم‌زمانی مانند lock یا Mutex استفاده کرد.
  • هزینه اضافی مدیریت Thread ها

    هر Thread برای خود یک فضای اختصاصی در حافظه دارد.
    بنابراین، تعداد زیادی Thread می‌تواند موجب افزایش مصرف حافظه و کاهش کارایی شود.
    برای حل این مشکل، می‌توان از ThreadPool یا Task برای مدیریت بهینه تعداد Thread ها استفاده کرد.
  • زمان‌بندی (Scheduling)

    در یک برنامه Multi-Threaded، زمان‌بندی اجرای Thread ها به عهده سیستم‌عامل است.
    این زمان‌بندی می‌تواند تأثیر زیادی بر کارایی برنامه داشته باشد.

 

چالش‌ها و مشکلات در Multi-Threading

 

استفاده از Task به جای Thread

در سی‌شارپ، Task یک ابزار جدیدتر برای انجام عملیات به صورت هم‌زمان است.

Task ها از ThreadPool استفاده می‌کنند، که موجب مدیریت بهتر منابع و اجرای بهینه‌تر Thread ها می‌شود.

مثال استفاده از Task

using System;
using System.Threading.Tasks;

class Program
{
    static void Main()
    {
        // ایجاد و اجرای چند Task
        Task.Run(() => PrintMessage(1));
        Task.Run(() => PrintMessage(2));

        Console.WriteLine("Main thread is running.");
    }

    static void PrintMessage(int threadId)
    {
        Console.WriteLine($"Task {threadId} is running.");
    }
}


در این مثال، Task‌ها به صورت خودکار از ThreadPool استفاده می‌کنند و به این ترتیب منابع بهتر مدیریت می‌شوند.

 

مثال پروژه محور از Multi-Threaded  در سی شارپ

برای ایجاد یک پروژه Multi-Threaded در سی‌شارپ، فرض کنیم که هدف این است که یک برنامه بنویسیم که داده‌های مختلف را به طور همزمان پردازش کند.

برای این کار، یک پروژه ساده به نام "پردازش موازی داده‌ها" طراحی می‌کنیم که در آن یک لیست بزرگ از اعداد به بخش‌های مختلف تقسیم شده و هر بخش به طور همزمان توسط Thread های مختلف پردازش می‌شود.

پس از اتمام پردازش، نتیجه نهایی جمع‌بندی می‌شود.

در این پروژه، فرض می‌کنیم که داده‌ها شامل لیستی از اعداد تصادفی هستند و هدف این است که مجموع اعداد بزرگ‌تر از یک مقدار خاص را پیدا کنیم

. این کار با استفاده از Multi-Threading انجام می‌شود تا زمان پردازش کاهش یابد.

مراحل پروژه:

  • تولید داده‌ها: ابتدا یک لیست از اعداد تصادفی تولید می‌کنیم.

  • تقسیم داده‌ها: داده‌ها را به چندین بخش تقسیم می‌کنیم.

  • پردازش موازی: هر بخش را با استفاده از Thread های جداگانه پردازش می‌کنیم.

  • جمع‌بندی نتایج: پس از اتمام پردازش، نتایج را جمع‌بندی کرده و مجموع نهایی را محاسبه می‌کنیم.


کد پروژه:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;

class Program
{
    // لیست برای ذخیره داده‌ها و نتایج
    static List<int> data = new List<int>();
    static int totalSum = 0;
    static readonly object lockObj = new object();  // برای هم‌زمانی (Synchronization)

    // تعداد Thread هایی که می‌خواهیم ایجاد کنیم
    static int numThreads = 4;

    // تابعی برای تولید اعداد تصادفی
    static void GenerateData(int count)
    {
        Random rand = new Random();
        for (int i = 0; i < count; i++)
        {
            data.Add(rand.Next(1, 100));  // اعداد تصادفی بین 1 تا 100
        }
    }

    // تابعی برای پردازش داده‌ها و پیدا کردن اعداد بزرگ‌تر از مقدار مشخص
    static void ProcessData(object threadIndex)
    {
        int sectionSize = data.Count / numThreads;  // اندازه هر بخش برای هر Thread
        int start = (int)threadIndex * sectionSize;
        int end = (int)threadIndex == numThreads - 1 ? data.Count : start + sectionSize;

        int localSum = 0;
        for (int i = start; i < end; i++)
        {
            if (data[i] > 50)  // اگر عدد بزرگ‌تر از 50 بود
            {
                localSum += data[i];
            }
        }

        // استفاده از lock برای هم‌زمانی و جلوگیری از مشکلات دسترسی همزمان به totalSum
        lock (lockObj)
        {
            totalSum += localSum;
        }

        Console.WriteLine($"Thread {threadIndex} processed from index {start} to {end - 1}");
    }

    static void Main()
    {
        // تولید داده‌ها
        GenerateData(1000);  // ایجاد 1000 عدد تصادفی

        // ایجاد و شروع Thread ها
        List<Thread> threads = new List<Thread>();
        for (int i = 0; i < numThreads; i++)
        {
            Thread t = new Thread(ProcessData);
            threads.Add(t);
            t.Start(i);  // ارسال شناسه Thread به متد ProcessData
        }

        // منتظر می‌مانیم تا تمامی Thread ها تمام شوند
        foreach (Thread t in threads)
        {
            t.Join();
        }

        // نمایش نتیجه نهایی
        Console.WriteLine($"Total sum of numbers greater than 50: {totalSum}");
    }
}


توضیحات پروژه

  • تولید داده‌ها
    متد GenerateData یک لیست از اعداد تصادفی بین 1 تا 100 تولید می‌کند.
    این داده‌ها به لیست data اضافه می‌شوند.
  • تقسیم داده‌ها
    تعداد Thread ها را در متغیر numThreads تعیین می‌کنیم. در اینجا ۴ Thread برای پردازش داده‌ها داریم.
    داده‌ها به طور مساوی بین Thread ها تقسیم می‌شوند. هر Thread یک بخش از لیست داده‌ها را پردازش می‌کند.
  • پردازش موازی
    هر Thread تابع ProcessData را اجرا می‌کند که در آن داده‌ها را بررسی می‌کند تا اعداد بزرگ‌تر از ۵۰ را پیدا کرده و جمع کند.
    برای جلوگیری از مشکلات هم‌زمانی که در آن چند Thread به متغیر totalSum دسترسی دارند، از lock استفاده می‌شود تا اطمینان حاصل کنیم که تنها یک Thread در هر لحظه به totalSum دسترسی دارد.


نتیجه اجرای برنامه

در نتیجه اجرای این برنامه، شما به طور هم‌زمان مجموع اعداد بزرگ‌تر از ۵۰ را از لیست داده‌ها محاسبه می‌کنید و پس از پردازش تمام بخش‌ها، مجموع نهایی را مشاهده می‌کنید.

به عنوان مثال

Thread 0 processed from index 0 to 249
Thread 1 processed from index 250 to 499
Thread 2 processed from index 500 to 749
Thread 3 processed from index 750 to 999
Total sum of numbers greater than 50: 24812


این برنامه نشان می‌دهد که چگونه می‌توان با استفاده از Multi-Threading و تقسیم داده‌ها به بخش‌های مختلف، پردازش‌ها را تسریع کرد و زمان اجرای برنامه را کاهش داد.

 

 

 

 

 

دوره های مرتبط
آموزش برنامه نویسی سی شارپ,آموزش پروژه محور سی شارپ,آموزش مقدماتی تا پیشرفته سی شارپ,طراحی نرم افزار تحت ویندوز

آموزش برنامه نویسی سی شارپ

زبان شی گرایی حرفه ای سی شارپ یک زبان قدرتمند برای طراحی نرم افزار به شمار میرود.

999,000 تومان

2.4k بازدید

ارسال دیدگاه

برای ارسال نظر لطفا ورود یا ثبت نام کنید.