English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

دليل أساسي C#

دليل متقدم C#

C# مبدأ التوجه بالأهداف (OOP)

المتغيرات المتعددة في C#

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

الخط هوالعملية الخفيفةمثال شائع على استخدام الخطوط هو تنفيذ البرمجة المتوازية في نظام التشغيل الحديث. يمكن أن توفر الخطوط توفيرًا في دوران المعالج، مما يزيد من كفاءة التطبيق.

حتى الآن، البرنامج الذي كتبناه هو عملية واحدة تعمل كنموذج تنفيذية لبرنامج تشغيل متسلسل. ولكن، يمكن تنفيذ تطبيق واحد فقط في نفس الوقت. من أجل تنفيذ عدة مهام في نفس الوقت، يمكن تقسيمه إلى خطوط أقل.

حياة النواة

بداية حياة النواة تبدأ عند إنشاء كائن Thread من System.Threading.Thread، تنتهي عند إلغاء تنفيذ النواة أو اكتمال تنفيذها.

إليك قائمة بالحالات المختلفة في حياة النواة:

  • الحالة غير الم启动ة: الحالة عند إنشاء نموذج النواة ولكن لم يتم استدعاء طريقة Start.

  • الحالة الجاهزة: الحالة عند استعداد النواة للتنفيذ وانتظار دورة CPU.

  • الحالة غير القابلة للتنفيذ: في الحالات التالية لا يمكن تشغيل النواة:

    • تم استدعاء طريقة Sleep

    • تم استدعاء طريقة Wait

    • التحكُم في I/O

  • الحالة الميتة: الحالة عند اكتمال تنفيذ النواة أو إلغاء تنفيذها.

النواة الرئيسية

في C#،System.Threading.Thread يستخدم هذا الكائن للعمل على النواة. يسمح بإنشاء وتواصل مع نواة واحدة في تطبيق متعدد النواة. يُسمى النواة الأولى التي يتم تنفيذها في العمليةالنواة الرئيسية.

عند بدء تنفيذ برنامج C#، يتم إنشاء النواة الرئيسية تلقائيًا. يمكنك استخدام Thread النواة التي أنشأها يتم استدعاؤها بواسطة فرع النواة الرئيسية. يمكنك استخدام. CurrentThread زيارة خصائص النواة.

برنامج التالي يوضح تنفيذ النواة الرئيسية:

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

الخصائص والأساليب المعتادة لـ Thread

في الجدول أدناه يُعرض Thread بعض من الأمثلة الشائعة لـ الخصائص:

الخصائصالوصف
CurrentContextالحصول على السياق الحالي الذي ي�行ر فيها النواة.
CurrentCultureالحصول أو تعيين منطقة اللغة الحالية للنواة الحالية.
CurrentPrincipalالحصول أو تعيين المسؤول الحالي للنواة (للأمان القائم على الأدوار).
CurrentThreadالحصول على النواة التي تعمل حاليًا.
CurrentUICultureالحصول أو تعيين منطقة اللغة الحالية التي يستخدمها إدارة الموارد لتشخيص الموارد المحددة بالمنطقة عند تشغيل الوقت.
ExecutionContextالحصول على Object ExecutionContext يحتوي على معلومات حول مختلف سياقات النواة الحالية.
IsAliveالحصول على قيمة تشير إلى حالة تنفيذ النواة الحالية.
IsBackgroundالحصول أو تعيين قيمة تشير إلى ما إذا كانت النواة thread خلفية.
IsThreadPoolThreadالحصول على قيمة تشير إلى ما إذا كان الخيط ينتمي إلى خزانة الخيوط المضيفة.
ManagedThreadIdالحصول على معرف فريد للخيط المضيف.
Nameالحصول أو تعيين اسم الخيط.
Priorityالحصول أو تعيين قيمة تشير إلى أولوية جدولة الخيط.
ThreadStateالحصول على قيمة تحتوي على حالة الخيط الحالية.

في الجدول أدناه يُعرض Thread بعض من الأمثلة الشائعة لـ الطريقة:

الرقماسم الطريقة & وصف
1public void Abort()
توليد استثناء ThreadAbortException في الخيط الذي يدعو هذه الطريقة، لبدء عملية إنهاء هذا الخيط. عادةً ما يؤدي استدعاء هذه الطريقة إلى إنهاء الخيط.
2public static LocalDataStoreSlot AllocateDataSlot()
تخصيص منافذ البيانات غير المسمى في جميع الخيوط. من أجل الحصول على أداء أفضل، يُرجى التغيير إلى استخدام الحقول المزودة بميزة ThreadStaticAttribute.
3public static LocalDataStoreSlot AllocateNamedDataSlot( string name)
تخصيص منافذ البيانات المسمى في جميع الخيوط. من أجل الحصول على أداء أفضل، يُرجى التغيير إلى استخدام الحقول المزودة بميزة ThreadStaticAttribute.
4public static void BeginCriticalRegion()
إعلام المضيف بأنه سيتم الدخول إلى منطقة برمجية حيث يمكن أن يؤدي تعطيل الخيط أو الاستثناء غير المعالج إلى تأثير على المهام الأخرى في مجال التطبيق.
5public static void BeginThreadAffinity()
إعلام المضيف بأنه سيتم تنفيذ الأوامر التي تعتمد على هوية الخيط المادي الحالي للنظام التشغيل.
6public static void EndCriticalRegion()
إعلام المضيف بأنه سيتم الدخول إلى منطقة برمجية حيث يمكن أن يؤدي تعطيل الخيط أو الاستثناء غير المعالج إلى تأثير على المهام الأخرى في مجال التطبيق.
7public static void EndThreadAffinity()
إعلام المضيف عن إكمال الأوامر التي تعتمد على هوية الخيط المادي الحالي للنظام التشغيل.
8public static void FreeNamedDataSlot(string name)
إزالة الاتصال بين الأسماء والمنافذ في جميع الخيوط الموجودة في العملية. من أجل الحصول على أداء أفضل، يُرجى التغيير إلى استخدام الحقول المزودة بميزة ThreadStaticAttribute.
9public static Object GetData( LocalDataStoreSlot slot )
استرجاع القيمة من السطر المحدد في المجال الحالي للسطر الحالي. للحصول على أداء أفضل، استخدم الحقول التي تم تسميتها باستخدام ThreadStaticAttribute.
10public static AppDomain GetDomain()
إرجاع المجال الحالي الذي يعمل فيه السطر الحالي.
11public static AppDomain GetDomainID()
إرجاع معرف المجال التطبيقي الفريد.
12public static LocalDataStoreSlot GetNamedDataSlot( string name )
البحث عن سطر مسمى. للحصول على أداء أفضل، استخدم الحقول التي تم تسميتها باستخدام ThreadStaticAttribute.
13public void Interrupt()
انقاذ السطر في حالة WaitSleepJoin.
14public void Join()
حظر سطر النداء، حتى ينهي سطر ما.
15public static void MemoryBarrier()
بالطريقة التالية لتحقيق التوازن في الوصول إلى الذاكرة: لا يمكن للمعالج الحالي للسطر الحالي تنفيذ الوصول إلى الذاكرة بعد تنفيذ MemoryBarrier، قبل تنفيذ MemoryBarrier.
16public static void ResetAbort()
إلغاء إلغاء السطر المطلوب للسطر الحالي.
17public static void SetData( LocalDataStoreSlot slot, Object data )
في السطر الذي يشتغل حاليًا، قم بتعيين بيانات المجال الحالي في السطر المحدد. للحصول على أداء أفضل، استخدم الحقول التي تم تسميتها باستخدام ThreadStaticAttribute.
18public void Start()
تبدأ سطرًا جديدًا.
19public static void Sleep( int millisecondsTimeout )
يوقف السطر لبعض الوقت.
20public static void SpinWait( int iterations )
Causes the thread to wait for the time defined by the iterations parameter.
21public static byte VolatileRead( ref byte address )
public static double VolatileRead( ref double address )
public static int VolatileRead( ref int address )
public static Object VolatileRead( ref Object address )

Read the field value. The value is written by any processor of the computer, regardless of the number of processors or the state of the processor cache. This method has different overloads. Here are some forms.
22public static void VolatileWrite( ref byte address, byte value )
public static void VolatileWrite( ref double address, double value )
public static void VolatileWrite( ref int address, int value )
public static void VolatileWrite( ref Object address, Object value )

Immediately write a value to the field to make the value visible to all processors in the computer. This method has different overloads. Here are some forms.
23public static bool Yield()
Causes the calling thread to execute another thread that is ready to run on the current processor. The operating system selects the thread to be executed.

Create thread

Threads are created by extending the Thread class. The extended Thread class calls Start() Methods to start the execution of a child thread.

The following program demonstrates this concept:

using System;
using System.Threading;
namespace MultithreadingApplication
{
    class ThreadCreationProgram
    {
        public static void CallToChildThread()
        {
            Console.WriteLine("يبدأ السطر الفرعي");
        }
        
        static void Main(string[] args)
        {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("في الطرفُ الرئيسي: إنشاءُ السطرِ الفرعي");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}

عندما يتم ترجمة وتنفيذ الكود أعلاه، سيتم إنتاج النتيجة التالية:

في Principal: إنشاء السطر الفرعي
يبدأ السطر الفرعي

Manage threads

The Thread class provides various methods for managing threads.

The following example demonstrates sleep() The use of methods, used to pause a thread at a specific time.

using System;
using System.Threading;
namespace MultithreadingApplication
{
    class ThreadCreationProgram
    {
        public static void CallToChildThread()
        {
            Console.WriteLine("يبدأ السطر الفرعي");
            // Thread pause 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("في الطرفُ الرئيسي: إنشاءُ السطرِ الفرعي");
            Thread childThread = new Thread(childref);
            childThread.Start();
            Console.ReadKey();
        }
    }
}

عندما يتم ترجمة وتنفيذ الكود أعلاه، سيتم إنتاج النتيجة التالية:

في Principal: إنشاء السطر الفرعي
يبدأ السطر الفرعي
تم إيقاف السطر الفرعي لمدة 5 ثوانٍ
استئناف السطر الفرعي

تدمير السطر

Abort() يستخدم هذا النوع من الطريقة لتدمير السطر.

من خلال إطلاقه threadabortexception إلغاء السطر أثناء التشغيل. هذا الاستثناء لا يمكن التقاطعه، إذا كان finally الكتلة، يتم إرسال التحكم إلى finally الكتلة.

البرنامج التالي يوضح هذا النقطة:

using System;
using System.Threading;
namespace MultithreadingApplication
{
    class ThreadCreationProgram
    {
        public static void CallToChildThread()
        {
            try
            {
                Console.WriteLine("يبدأ السطر الفرعي");
                // عد إلى 10
                for(int counter = 0; counter <= 10; counter++)
                {
                    Thread.Sleep(500);
                    Console.WriteLine(counter);
                }
                Console.WriteLine("انتهاء السطر الفرعي");
            }
            catch(ThreadAbortException e)
            {
                Console.WriteLine("استثناء إلغاء السطر");
            }
            finally
            {
                Console.WriteLine("لم يتم القبض على استثناء السطر");
            }
        }
        
        static void Main(string[] args)
        {
            ThreadStart childref = new ThreadStart(CallToChildThread);
            Console.WriteLine("في الطرفُ الرئيسي: إنشاءُ السطرِ الفرعي");
            Thread childThread = new Thread(childref);
            childThread.Start();
            // توقيف السطر الرئيسي لفترة من الزمن
            Thread.Sleep(2000);
            // الآن، إلغاء إكمال السطر الفرعي
            Console.WriteLine("في الطرفُ الرئيسي: إلغاء إكمالِ السطرِ الفرعي");
            childThread.Abort();
            Console.ReadKey();
        }
    }
}

عندما يتم ترجمة وتنفيذ الكود أعلاه، سيتم إنتاج النتيجة التالية:

في Principal: إنشاء السطر الفرعي
يبدأ السطر الفرعي
0
1
2
في Principal: تدمير السطر الفرعي
استثناء التدمير للسطر
لم يتمكن من التقاط استثناء السطر