Thursday, April 24, 2014

برمجة متقدمة سي شارب المعالجة المتوازية المتعددة ثريد C# Multithreading

11:26 AM

Share it Please

المعالجة المتوازية المتعددة C# - Multithreading

برمجة متقدمة سي شارب المعالجة المتوازية المتعددة C#  Multithreading
المعالجة المتوازية المتعددة ثريد C#  Multithreading

المعالجة المتوازية المتعددة C#  Multithreading

ماهو  thread   او التمرير او المسار المعاجة المجزئة ؟

يعرف بأنه مسار تنفيذ البرنامج. يحدد كل مسار فريد تدفق  من التحكم. إذا كان التطبيق الخاص بك معقدة ويستهلك وقتا في المعالجة فأن الحل هو استخدام المعاجة المتعددة بحيث إعطاء كل وظيفة متكاملة في برنامجك مسار أي ثريد فيتم معالجة البرنامج الى عدة مسارات ومعالجات متوازية وفي حال حدوث اي خلال  في معالجة وحدة وظيفية فانه لا يؤثر على عمل البرنامج ككل.
في الصورة التالية توضح لك  ماهو المعالجة المتعددة وففي المثال لدينا برنامج واحد فقط شغال من متصفح جوجل كروم ولس ان البرنامج مشغل أكثر من مرة حيث يظهر  تكرار الاسم فان التكرار هو عبارة عن ثريد thread فكل واحد ثمثل مسار معالجة فمثلا لو حدث خللل في واحدة فلن يؤثر على الباقي وهنا كل مسار عبارة عن صفحة لموقع او إضافة plugin هذا هو الثريد.
برمجة متقدمة سي شارب المعالجة المتوازية المتعددة ثريد C#  Multithreading
المعالجة المتوازية المتعددة ثريد C#  Multithreading

مميزات المعالجة المتوازية للمسارات او الثريد

  • تقلل من الاستهلاك للمعالج
  • تزيد من كفاءة التطبيق

دورة حياة المعالجة المتعددة المتوازية المسارات Thread Life Cycle

عند استخدام المعالجة المتعددة يتم انشاء كائن من الفئة thread وينتهي الكائن بانتهاء المعالجة.
التالي هو جميع الحالات في دورة المعالجة المتوازية

  • Unstarted State   في هذه الحالة ثم انشاء كائن المعالجة ولكن لم يتم استدعاء الدالة التي تبداء بالثريد او معالجة  المسار.
  •   Ready State  وفي هذه الحالة يتم تجهيز المعالجة للبرنامج ويتم ارساله الى دورة المعالجة للبدء.
  •  Not Runnable State  وفي هذه الحالة تكون الثريد غير قابلة للتشغيل في الحالات التالية
    • ثم استدعاء دالة sleep
    • ثم استدعاء دالة الانتظار wait
    • ثم اغلاق المعالجة بواسطة مشغل المدخل والخارج i/o
  • Dead State   حالة الانهاء يتم استدعاءها عند الانتهاء من تنفيذ البرنامج بالكامل او عند الغاء العملية.

المسار الرئيسي Main Thread

يتم استخدام المعالجة الرئيسية وهي او شي يتم تنفيذه في المعالجة المتوازية وهو اوما يتم عنده بدء المعالجة بالمسارات المتعددة وهو يتحكم في المعالجة للتطبيقك وتقوم السي شارب تلقاائيا بتكوينه.

مثال على المسار الرئيسي 


using System;
using System.Threading;

namespace MultithreadingApplication
{
    class MainThreadProgram
    {
        static void Main(string[] args)
        {
            Thread th = Thread.CurrentThread;
            th.Name = "MainThread";
            Console.WriteLine("This is {0}", th.Name);
            Console.ReadKey();
        }
    }
}

ناتج المثال.

This is MainThread

إنشاء معالجة متوازية Creating Threads

باستخدام الدالة start نبداء المعالجة المتوازية

using System;
using System.Threading;

namespace MultithreadingApplication
{
    class ThreadCreationProgram
    {
        public static void CallToChildThread()
        {
            Console.WriteLine("Child thread starts");
        }
        
        static void Main(string[] args)
        {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}

ناتج كود انشاء المعالجة  المتوازية اوالمسارات

In Main: Creating the Child thread
Child thread starts

Managing Threadsإدارة المعالجة المتوازية

 sleep() الدالة تستخدم في ايقاف المعالجة لفترة من الزمن.
using System;
using System.Threading;

namespace MultithreadingApplication
{
    class ThreadCreationProgram
    {
        public static void CallToChildThread()
        {
            Console.WriteLine("Child thread starts");
            // the thread is paused for 5000 milliseconds
            int sleepfor = 5000; 
            Console.WriteLine("Child Thread Paused for {0} seconds", 
                              sleepfor / 1000);
            Thread.Sleep(sleepfor);
            Console.WriteLine("Child thread resumes");
        }
        
        static void Main(string[] args)
        {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}
ناتج كود معالجة  المسارات اوالثريد
In Main: Creating the Child thread
Child thread starts
Child Thread Paused for 5 seconds
Child thread resumes

انهاء المعالجة المساراتDestroying Threads

Abort() تستخدم الدالة لانهاء المعالجة المتعددة
ThreadAbortException. من خلال القاء اسثتناء

using System;
using System.Threading;

namespace MultithreadingApplication
{
    class ThreadCreationProgram
    {
        public static void CallToChildThread()
        {
            try
            {

                Console.WriteLine("Child thread starts");
                // do some work, like counting to 10
                for (int counter = 0; counter <= 10; counter++)
                {
                    Thread.Sleep(500);
                    Console.WriteLine(counter);
                }
                Console.WriteLine("Child Thread Completed");

            }
            catch (ThreadAbortException e)
            {
                Console.WriteLine("Thread Abort Exception");
            }
            finally
            {
                Console.WriteLine("Couldn't catch the Thread Exception");
            }

        }
        
        static void Main(string[] args)
        {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("In Main: Creating the Child thread");
            Thread childThread = new Thread(childref);
            childThread.Start();
            //stop the main thread for some time
            Thread.Sleep(2000);
            //now abort the child
            Console.WriteLine("In Main: Aborting the Child thread");
            childThread.Abort();
            Console.ReadKey();
        }
    }
}
ناتج كود تدمير المعالجة المتوازية
In Main: Creating the Child thread
Child thread starts
0
1
2
In Main: Aborting the Child thread
Thread Abort Exception
Couldn't catch the Thread Exception 

  


لمتابعتي
تويتر: @aalmahallawi
IT Help Desk,
SEO Arabic Expert ,PHP,C#,ASPX
Al alami st
gaza -jabaliaGaza Strip
Palestine
Email :ahmed.almahallawi@gmail.com
DOB: 05/10/1984

1 comments :

Post a Comment