‏إظهار الرسائل ذات التسميات advance-csharp. إظهار كافة الرسائل
‏إظهار الرسائل ذات التسميات advance-csharp. إظهار كافة الرسائل

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

المعالجة المتوازية المتعددة 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

برمجة متقدمة سي شارب ماهي الاكواد الغير معالجة او الغير أمنة Unsafe Codes c#

 برمجة متقدمة سي شارب ماهي  الاكواد الغير معالجة او الغير أمنة Unsafe Codes c# 

ماهي  الاكواد الغير معالجة او الغير أمنة Unsafe Codes

ماهي  الاكواد الغير معالجة او الغير أمنة Unsafe Codes

تسمح لغة السي شارب باستخدام متغيرات المؤشرات في أكواد السي شارب . الكود الغير معالج هو كود يستخدم المؤشرات كمتغيرات,

ماهو المؤشر:

المؤشر هو متغير قيمته هي لعنوان لمتغير أخر.لاستخدام المؤشرات فيجب تعريفها قبل استخدامها مثلها مثل أي متغير.

الصيغة العامة لتعريف المؤشرات في سي شارب

type *var-name;
التالي تعريفات صحيحة للمؤشرات
int *ip; /* pointer to an integer */
double *dp; /* pointer to a double */
float *fp; /* pointer to a float */
char *ch /* pointer to a character */

المثال التالي يستخدم المؤشرات باستخدام محدد الوصولunsafe

using System;
namespace UnsafeCodeApplication
{
 class Program
 {
 static unsafe void Main(string[] args)
 {
 int var = 20;
 int* p = &var;
 Console.WriteLine("Data is: {0} ", var);
 Console.WriteLine("Address is: {0}", (int)p);
 Console.ReadKey();
 }
 }
}
ناتج الكود السابق المؤشرات
Data is: 20
Address is: 99215364


استعادة البيانات ذات القيمة باستخدام المؤشرات
لاستعادة البيانات ذات القيمة نستخدم الدالة tostring
using System;
namespace UnsafeCodeApplication
{
 class Program
 {
 public static void Main()
 {
 unsafe
 {
 int var = 20;
 int* p = &var;
 Console.WriteLine("Data is: {0} " , var);
 Console.WriteLine("Data is: {0} " , p->ToString());
 Console.WriteLine("Address is: {0} " , (int)p);
 }
 Console.ReadKey();
 }
 }
}

ناتج مثال المؤشرات السابق

Data is: 20
Data is: 20
Address is: 77128984
تمرير المؤشرات كمتغيرات للدالة
using System;
namespace UnsafeCodeApplication
{
 class TestPointer
 {
 public unsafe void swap(int* p, int *q)
 {
 int temp = *p;
 *p = *q;
 *q = temp;
 }
 public unsafe static void Main()
 {
 TestPointer p = new TestPointer();
 int var1 = 10;
 int var2 = 20;
 int* x = &var1;
 int* y = &var2;
 Console.WriteLine("Before Swap: var1:{0}, var2: {1}", var1, var2);
 p.swap(x, y);
 Console.WriteLine("After Swap: var1:{0}, var2: {1}", var1, var2);
 Console.ReadKey();
 }
 }
}
ناتج مثال المؤشرات السابق
Before Swap: var1: 10, var2: 20
After Swap: var1: 20, var2: 10
الوصول لعناصر المصفوفة باستخدام المؤشرات
للوصول لعناصر المصفوفة باستخدام المؤشرات كما في الس يلس بلس فانك بحاجةلاستخدام fixed keyword.
using System;
namespace UnsafeCodeApplication
{
 class TestPointer
 {
 public unsafe static void Main()
 {
 int[] list = {10, 100, 200};
 fixed(int *ptr = list)
 /* let us have array address in pointer */
 for ( int i = 0; i < 3; i++)
 {
 Console.WriteLine("Address of list[{0}]={1}",i,(int)(ptr + i));
 Console.WriteLine("Value of list[{0}]={1}", i, *(ptr + i));
 }
 Console.ReadKey();
 }
 }
}
ناتج مثال المؤشرات السابق
Address of list[0] = 31627168
Value of list[0] = 10
Address of list[1] = 31627172
Value of list[1] = 100
Address of list[2] = 31627176
Value of list[2] = 200

لاستخدام الكود الغير امنة عليك تفعيله كالتالي في بيئة فيجوال استديو

  1.  افتح قائمة Project properties 
  2.  ثم اضغط على التبويب Build .
  3.  اختر التالي "Allow unsafe code".

<<السابق الدالة الغير معروفة


التالي المعالجة المتعددة >>
---------------------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------------------


برمجة متقدمة سي شارب ماهو العام C# - Generics

 ماهو العام C# - Generics

C# - Generics


 ماهو العام Generics ؟

تسمح لك بتأخير تخصيص نوع البيانات لعناصر البرنامج في الفئة أو الدالة .حتي يتم استخدامها في البرنامج. بمعنى أخر ان الفئة العام تسمح لك بإنشاء أي نوع من أنواع البيانات.
يمكنك كتابة مواصفات للفئة  والدالة مع استبدال الباراميترات  لنوع البيانات .عندما يصادف المترجم مشيد للفئة أو استدعاء دالة ، فإنه يولد كود لمعالجة نوع البيانات المحددة. وهذا مثال بسيط يساعد في فهم  العام :

مثال على العام Generics

using System;
using System.Collections.Generic;

namespace GenericApplication
{
    public class MyGenericArray<T>
    {
        private T[] array;
        public MyGenericArray(int size)
        {
            array = new T[size + 1];
        }
        public T getItem(int index)
        {
            return array[index];
        }
        public void setItem(int index, T value)
        {
            array[index] = value;
        }
    }
           
    class Tester
    {
        static void Main(string[] args)
        {
            //declaring an int array
            MyGenericArray intArray = new MyGenericArray(5);
            //setting values
            for (int c = 0; c < 5; c++)
            {
                intArray.setItem(c, c*5);
            }
            //retrieving the values
            for (int c = 0; c < 5; c++)
            {
                Console.Write(intArray.getItem(c) + " ");
            }
            Console.WriteLine();
            //declaring a character array
            MyGenericArray charArray = new MyGenericArray(5);
            //setting values
            for (int c = 0; c < 5; c++)
            {
                charArray.setItem(c, (char)(c+97));
            }
            //retrieving the values
            for (int c = 0; c< 5; c++)
            {
                Console.Write(charArray.getItem(c) + " ");
            }
            Console.WriteLine();
            Console.ReadKey();
        }
    }
}

ناتج مثال العام Generics

0 5 10 15 20
a b c d e


مميزات العام Generics

  • فإنه يساعدك على تحقيق أقصى قدر من إعادة استخدام التعليمات البرمجية،وسلامة نوع البيانات ، والأداء.
  • مكنك إنشاء فئات مجموعة عامة  Generics. تحتوي على مكتبة NET فئة الإطار. وعدة فئات مجموعة عامة  Generics جديدة في فضاء الأسماء System.Collections.Generic. يمكنك استخدام هذه فئات المجموعة العام بدلا من الفئات في فضاء الأسماء System.Collections.
  • يمكنك إنشاء  واجهات عامة Generics الخاصة بك،  والفئات ، والدوال، والأحداث والتفويض.
  • يمكنك إنشاء فئات عامة Generics مقيدة لتمكين الوصول إلى الدوال على أنواع بيانات معينة.
  • يمكنك الحصول على معلومات حول أنواع تستخدم في نوع بيانات عامة Generics  في وقت التشغيل عن طريق الانعكاس Reflection.

الدوال العامة Generic Methods

مثال على الدوال العامة


using System;
using System.Collections.Generic;

namespace GenericMethodAppl
{
    class Program
    {
        static void Swap<T>(ref T lhs, ref T rhs)
        {
            T temp;
            temp = lhs;
            lhs = rhs;
            rhs = temp;
        }
        static void Main(string[] args)
        {
            int a, b;
            char c, d;
            a = 10;
            b = 20;
            c = 'I';
            d = 'V';

            //display values before swap:
            Console.WriteLine("Int values before calling swap:");
            Console.WriteLine("a = {0}, b = {1}", a, b);
            Console.WriteLine("Char values before calling swap:");
            Console.WriteLine("c = {0}, d = {1}", c, d);

            //call swap
            Swap(ref a, ref b);
            Swap(ref c, ref d);

            //display values after swap:
            Console.WriteLine("Int values after calling swap:");
            Console.WriteLine("a = {0}, b = {1}", a, b);
            Console.WriteLine("Char values after calling swap:");
            Console.WriteLine("c = {0}, d = {1}", c, d);
            Console.ReadKey();
        }
    }
}

ناتج الدوال العامة Generic Methods

Int values before calling swap:
a = 10, b = 20
Char values before calling swap:
c = I, d = V
Int values after calling swap:
a = 20, b = 10
Char values after calling swap:
c = V, d = I

مثال على التفويض العام Generic Delegates

delegate T NumberChanger<T>(T n);

Generics مثال على التفويض العام 

using System;
using System.Collections.Generic;

delegate T NumberChanger<T>(T n);
namespace GenericDelegateAppl
{
    class TestDelegate
    {
        static int num = 10;
        public static int AddNum(int p)
        {
            num += p;
            return num;
        }

        public static int MultNum(int q)
        {
            num *= q;
            return num;
        }
        public static int getNum()
        {
            return num;
        }

        static void Main(string[] args)
        {
            //create delegate instances
            NumberChanger nc1 = new NumberChanger(AddNum);
            NumberChanger nc2 = new NumberChanger(MultNum);
            //calling the methods using the delegate objects
            nc1(25);
            Console.WriteLine("Value of Num: {0}", getNum());
            nc2(5);
            Console.WriteLine("Value of Num: {0}", getNum());
            Console.ReadKey();
        }
    }
}

ناتج مثال التفويض Generics

Value of Num: 35
Value of Num: 175


Ahmed Ata Almahallawi
Freelancer
IT Help Desk,
SEO experience,PHP,C#,ASPX,SQL
Al alami st
Gaza -jabaliaGaza Strip
Palestine
Marital Status: Single 
DOB: 05/10/1984

1/2/2014