خرید دوره های برنامه نویسی با کیف پولت

Thread ها در سی شارپ,نحوه ایجاد یک Thread در #C,مزایا و معایب استفاده از Thread

Thread ها در سی شارپ

Thread ها در سی شارپ واحدهای پردازش برای اجرای موازی دستورها هستند. با استفاده از آن‌ها می‌توان کارایی برنامه را افزایش داد.

تیم تحریریه
271
0
18 اسفند 1403
لینک کوتاه

Thread ها در سی شارپ

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

به کمک کلاس Thread از فضای نام System.Threading، می‌توان پردازش‌های موازی ایجاد کرد که کارایی برنامه را بهبود می‌بخشد.

برای مثال، زمانی که یک برنامه نیاز به انجام چندین کار به‌صورت هم‌زمان دارد، مانند دریافت داده از سرور در پس‌زمینه در حالی که رابط کاربری همچنان پاسخگو باقی می‌ماند، استفاده از Thread‌ها بسیار مفید است.

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

به‌عنوان مثال:

using System;
using System.Threading;

class Program  
{  
    static void PrintNumbers()  
    {  
        for (int i = 1; i <= 5; i++)  
        {  
            Console.WriteLine(i);  
            Thread.Sleep(1000); // توقف 1 ثانیه‌ای برای شبیه‌سازی پردازش  
        }  
    }  

    static void Main()  
    {  
        Thread t = new Thread(PrintNumbers);  
        t.Start();  
        Console.WriteLine("Thread اصلی ادامه دارد...");  
    }  
}


در این مثال، متد PrintNumbers در یک Thread جداگانه اجرا شده و برنامه می‌تواند هم‌زمان به اجرای سایر عملیات ادامه دهد.

 

Thread ها در سی شارپ

 

نحوه ایجاد یک Thread در #C

برای ایجاد یک Thread در #C می‌توان از کلاس Thread که در فضای نام System.Threading قرار دارد، استفاده کرد.

برای ایجاد یک Thread، ابتدا باید یک متد یا دلیگیت را به عنوان وظیفه (Task) آن مشخص کنیم و سپس آن را به Thread اختصاص دهیم.

 

مثال : ایجاد و اجرای یک Thread ساده

using System;

using System.Threading;

class Program

{

    // متد که قرار است در Thread جدید اجرا شود

    static void PrintNumbers()

    {

        for (int i = 1; i <= 5; i++)

        {

            Console.WriteLine(i);

            Thread.Sleep(1000); // توقف 1 ثانیه‌ای برای شبیه‌سازی کار زمان‌بر

        }

    }

    static void Main()

    {

        // ایجاد یک Thread جدید و اختصاص متد PrintNumbers به آن

        Thread t = new Thread(PrintNumbers);
       

        // شروع اجرای Thread

        t.Start();


        // منتظر ماندن برای اتمام Thread

        t.Join();


        Console.WriteLine("Thread تمام شد.");

    }

}

در این مثال، یک Thread جدید با استفاده از کلاس Thread ایجاد شده است و متد PrintNumbers به آن اختصاص یافته است.

با استفاده از متد Start، اجرای Thread آغاز می‌شود و با استفاده از متد Join، برنامه منتظر می‌ماند تا اجرای Thread تکمیل شود.

 

 

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

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

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

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

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

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

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

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

 

 

 

نحوه مدیریت Threadها

  • متدهای کلاس Thread

    کلاس Thread در #C دارای چندین متد است که به شما کمک می‌کند تا با Threadها کار کنید:
    • ()Start: این متد برای شروع اجرای Thread استفاده می‌شود.
    • ()Join: این متد باعث می‌شود که Thread جاری منتظر بماند تا Thread دیگری که در حال اجرا است، تکمیل شود.
    • ()Sleep: این متد باعث متوقف شدن اجرای Thread برای مدت زمان مشخصی می‌شود.
    • ()Abort: این متد باعث متوقف شدن Thread می‌شود، اما بهتر است از آن اجتناب کنید، زیرا به‌طور ناگهانی Thread را خاتمه می‌دهد.
  •  Synchronization (همگام‌سازی)

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

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

مثال : استفاده از Lock برای همگام‌سازی

using System;

using System.Threading;


class Program

{

    static int counter = 0;

    static object lockObject = new object();


    static void IncrementCounter()

    {

        for (int i = 0; i < 1000; i++)

        {

            lock (lockObject)  // استفاده از lock برای جلوگیری از دسترسی همزمان

            {

                counter++;

            }

        }

    }


    static void Main()

    {

        Thread t1 = new Thread(IncrementCounter);

        Thread t2 = new Thread(IncrementCounter);

        t1.Start();

        t2.Start();

        t1.Join();

        t2.Join();


        Console.WriteLine("مقدار counter: " + counter);

    }

}

در این مثال، از lock برای اطمینان از این که تنها یک Thread در هر زمان به متغیر counter دسترسی دارد، استفاده شده است.

این روش از بروز مشکلات مربوط به رقابت داده‌ها جلوگیری می‌کند.

 

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

    در دنیای مدرن برنامه‌نویسی #C، بهتر است به جای استفاده از Threadهای سنتی، از Task استفاده کنید.
    کلاس Task که در فضای نام System.Threading.Tasks قرار دارد، مدیریت بهتری برای اجرای وظایف موازی فراهم می‌کند.

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

using System;

using System.Threading.Tasks;


class Program

{

    static void Main()

    {

        // اجرای Task به صورت غیرهمزمان

        Task.Run(() =>

        {

            for (int i = 1; i <= 5; i++)

            {

                Console.WriteLine(i);

                Task.Delay(1000).Wait(); // توقف 1 ثانیه‌ای

            }

        }).Wait();  // منتظر ماندن تا اتمام Task


        Console.WriteLine("Task تمام شد.");

    }

}

در این مثال، یک Task به‌طور غیرهمزمان اجرا می‌شود.

متد Task.Delay شبیه به Thread.Sleep عمل می‌کند و باعث توقف اجرای Task به مدت مشخصی می‌شود.

 

 

نحوه مدیریت Threadها

 

 

مزایا و معایب استفاده از Thread

  • مزایا

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

      اجرای چندین Thread به‌طور همزمان می‌تواند باعث افزایش کارایی برنامه شود.
    • اجرای موازی

      در پردازش‌های پیچیده، اجرای موازی می‌تواند زمان پردازش را به‌طور چشم‌گیری کاهش دهد.
  •  معایب

    • پیچیدگی بیشتر

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

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

مزایا و معایب استفاده از Thread

 

 

مثال پروژه محور از Thread ها در سی شارپ

پروژه: دانلود فایل‌ها به‌طور موازی

فرض کنید می‌خواهیم چند فایل را به‌طور موازی از یک URL دانلود کنیم. برای این کار، از Threadها برای دانلود فایل‌ها استفاده خواهیم کرد.

مراحل پروژه:

  • استفاده از کلاس Thread برای ایجاد Threadهای مختلف.

  • دانلود فایل‌ها به‌طور همزمان.

  • استفاده از متد ()Join برای هماهنگی بین Threadها.

  • شبیه‌سازی عملیات دانلود با استفاده از ()Thread.Sleep.

 

using System;

using System.Threading;

class Program

{

    // شبیه‌سازی دانلود فایل

    static void DownloadFile(string fileName)

    {

        Console.WriteLine($"شروع دانلود {fileName}...");

       

        // شبیه‌سازی دانلود با توقف به مدت 3 ثانیه

        Thread.Sleep(3000);

       

        Console.WriteLine($"دانلود {fileName} تمام شد.");

    }


    static void Main()

    {

        // تعریف نام فایل‌ها برای دانلود

        string[] fileNames = { "File1.txt", "File2.txt", "File3.txt", "File4.txt" };


        // ایجاد Thread برای هر فایل

        Thread[] threads = new Thread[fileNames.Length];

       

        for (int i = 0; i < fileNames.Length; i++)

        {

            // برای هر فایل یک Thread جدید ایجاد می‌کنیم

            string fileName = fileNames[i]; // استفاده از متغیر محلی برای جلوگیری از مشکل در استفاده از متغیرهای مشترک

            threads[i] = new Thread(() => DownloadFile(fileName));

            threads[i].Start(); // شروع دانلود فایل در Thread مربوطه

        }


        // منتظر ماندن برای اتمام همه Threadها

        foreach (var thread in threads)

        {

            thread.Join();

        }


        Console.WriteLine("همه فایل‌ها دانلود شدند.");

    }

}

توضیح کد:

  • DownloadFile: این متد شبیه‌سازی دانلود یک فایل است. به‌طور فرضی، هر فایل 3 ثانیه طول می‌کشد تا دانلود شود.

  • Thread[ ] threads: یک آرایه از Threadها برای نگهداری هر Thread مربوط به دانلود یک فایل.

  • Thread.Sleep(3000): این متد برای شبیه‌سازی مدت زمان دانلود فایل استفاده می‌شود. در دنیای واقعی، اینجا باید کد دانلود فایل از یک URL قرار گیرد.

  • ()Start: برای شروع عملیات دانلود، هر Thread را با استفاده از متد Start() اجرا می‌کنیم.

  • ()Join: پس از شروع تمام Threadها، با استفاده از Join() از برنامه می‌خواهیم تا اتمام همه Threadها منتظر بماند.

 

خروجی احتمالی:

شروع دانلود File1.txt...

شروع دانلود File2.txt...

شروع دانلود File3.txt...

شروع دانلود File4.txt...

دانلود File1.txt تمام شد.

دانلود File2.txt تمام شد.

دانلود File3.txt تمام شد.

دانلود File4.txt تمام شد.

همه فایل‌ها دانلود شدند.

توضیحات:

تمام فایل‌ها به‌طور موازی در 4 Thread مختلف دانلود می‌شوند.

در اینجا از Thread.Sleep برای شبیه‌سازی مدت زمان دانلود استفاده کرده‌ایم، ولی در دنیای واقعی، شما می‌توانید به جای آن از متدهایی مانند WebClient.DownloadFile برای دانلود فایل از اینترنت استفاده کنید.

()Join باعث می‌شود که برنامه منتظر شود تا تمام Threadها به اتمام برسند قبل از آن که پیامی مانند "همه فایل‌ها دانلود شدند" چاپ شود.

 

محصولات مرتبط

کاربران ما

شما هم نظرتون با ما دریاره “Thread ها در سی شارپ” اشتراک بزارید

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

منو