اشيع استخدام لتعبيرات لامدا هو تمرير الدالة كوسيط من النوع Delegate
اعرف ان الكلام غامض بعض الشيئ ؟؟ لكن اذا كنت قد تعاملت مع Delegate سابقاً يمكنك فهمها بشكل بسيط
لناخذ مثال على ذلك
لنفرض انه طلب منا ان نقوم بمعرفة العمليات التي يتم تشغيلها و التي تمتلك Thread واحد فقط
يوجد عدد من الحلول لمثل هذا السؤال كما يلي
كود بسيط يستخدم Linq يقوم بتحديد العملية التي توافق الشرط من المصفوفة ويضعها في Enumerable
ثم نقوم بالمرور على عناصر التعداد و نعرض اسم العملية
الان لو فكرنا قليلاً كيف يمكن ان نستفيد من Lambd في مثل هذا الامر
اولاً يمكنني الحصول على العمليات في مصفوفة من النوع Process
ومن ثم يمكنني استخدام الطرق الموسعة داخل المصفوفات و التي تحتوي على دوال جاهزة تقبل بداخلها بارمترات من النوع Lambda
عبارة Where السابقة في استعلام Linq يمكنني العثور عليها كدالة تعمل مع المصفوفات
و تحتاج الى بارميتر من النوع Func و تعيد قيمة منطقية
ليتضح الامر اكثر
مفهوم الـ asynchronous
بالعربي تلفظ (اسنكرونس)
لفظها ثقيل
وعكسها synchronous (سنكرونس) متزامن
مفهوم عدم التزامن مفهوم منفصل عن هذا الموضوع و يحتاج الى شرح منفصل
ولكن ولكي نغطي هذا الجزء مع الدوال و الاجراءات بشكل عام يمكننا شرحه بشكل مبسط وفق وروده في الاكواد
ترتبط العمليات غير المتزامنة بكلمتين مفتاحيتين هم Async و Await
و لجعل دالة ما او اجراء من النوع غير المتزامن يمكنك اضافة الكلمة Async قبل الدالة او الاجراء و من ثم تحتاج الى الكلمة Await في قلب الدالة, و التي بدورها تؤجل تنفيذ الكود الى ان يتم تنفيذ مهمة معينة او حتى يمكن ان تكون فاصل زمني محدد
مثال على ذلك
لن يتم ملئ TextBox1 الى بعد 3 ثواني , طبعاً هذا المثال للتوضيح وهو غير مرتبط بموضوعنا هنا و ليصبح اكثر ارتباط انظر الى الكود التالي
حاول ان تضع الكود في حدث Form_Load
هل اتضحت لك الصورة الان , ربطنا حدث Click الخاص بالزر بالاجراء ExampleMethodAsync تلقائياً مع بداية اقلاع النموذج ولم نعد بحاجة لمعالجة حدث الضغط (Click) بشكل منفصل
لم ينتهي الحديث عن Lambda و هناك الكثير الكثير عنه و يحتاج شرحه و التعمق فيه الى الكثير من الوقت و الجهد
و اتمنى ان اكون قد انرت شمعة لمن يجهل هذا الاسلوب او لمن يحتاج الى معلومات بسيطة عنه
اترك الباقي للمهتمين بالتوسع و اثراء الموضوع بمعرفتهم .
اعرف ان الكلام غامض بعض الشيئ ؟؟ لكن اذا كنت قد تعاملت مع Delegate سابقاً يمكنك فهمها بشكل بسيط
لناخذ مثال على ذلك
لنفرض انه طلب منا ان نقوم بمعرفة العمليات التي يتم تشغيلها و التي تمتلك Thread واحد فقط
يوجد عدد من الحلول لمثل هذا السؤال كما يلي
PHP كود :
Dim filteredQuery = From proc In Diagnostics.Process.GetProcesses
Where proc.Threads.Count = 1
Select proc
For Each proc In filteredQuery
MsgBox(proc.ProcessName)
Next
ثم نقوم بالمرور على عناصر التعداد و نعرض اسم العملية
الان لو فكرنا قليلاً كيف يمكن ان نستفيد من Lambd في مثل هذا الامر
اولاً يمكنني الحصول على العمليات في مصفوفة من النوع Process
ومن ثم يمكنني استخدام الطرق الموسعة داخل المصفوفات و التي تحتوي على دوال جاهزة تقبل بداخلها بارمترات من النوع Lambda
عبارة Where السابقة في استعلام Linq يمكنني العثور عليها كدالة تعمل مع المصفوفات
و تحتاج الى بارميتر من النوع Func و تعيد قيمة منطقية
ليتضح الامر اكثر
PHP كود :
Dim procList As Process() = Diagnostics.Process.GetProcesses
Dim filteredList = procList.Where(Function(p) p.Threads.Count = 1)
For Each proc In filteredList
MsgBox(proc.ProcessName)
Next
في السطر الثاني من الكود و تحديداً الدالة Where سترى انها تطبق على المصفوفات من النوع IEnumerable(of TSource) k و التي بدورها مشتقة من النوع Generic(of TSource) p و تعيد النوع IEnumerable(of TSource) p
لا تهتم كثيراً بهذا الكلام , و لكن دقق ان الدالة تحتاج الى وسيط من النوع Function يعيد قيمة منطقية
ولاحظ اننا مررنا دالة Lambda مع بارميتر (البارميتر هنا هو Process) و عمل الدالة هو تحديد Process يمتلك Thread واحد فقط
و بالتالي اذا تحقق الشرط ستعود الدالة بقيمة True و بالتالي ستضاف Process الى التعداد filteredList
و اخيراً قمنا بالمرور على العناصر داخل التعداد و عرض اسم العملية
بالنسبة للدوال التوسعية او الاضافية (Extention Methods) التي يمكنك جعلها تتوفر مع كائن ما بشكل افتراضي , ليس لدي الوقت الكثير لادخل في شرحها
لكن ولانني قد اشرت سابقاً لها في احد الاجوبة هنا تحديداً يمكنك مراجعة الرابط لفهم جزئي لها
يبدو الامر فيه بعض الصعوبة مبدئياً و لكن مع الوقت و التعود على استخدامها ستكتشف مدى قوتها.
مفهوم الـ asynchronous
بالعربي تلفظ (اسنكرونس)
لفظها ثقيلوعكسها synchronous (سنكرونس) متزامن
مفهوم عدم التزامن مفهوم منفصل عن هذا الموضوع و يحتاج الى شرح منفصل
ولكن ولكي نغطي هذا الجزء مع الدوال و الاجراءات بشكل عام يمكننا شرحه بشكل مبسط وفق وروده في الاكواد
ترتبط العمليات غير المتزامنة بكلمتين مفتاحيتين هم Async و Await
و لجعل دالة ما او اجراء من النوع غير المتزامن يمكنك اضافة الكلمة Async قبل الدالة او الاجراء و من ثم تحتاج الى الكلمة Await في قلب الدالة, و التي بدورها تؤجل تنفيذ الكود الى ان يتم تنفيذ مهمة معينة او حتى يمكن ان تكون فاصل زمني محدد
مثال على ذلك
PHP كود :
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Await ExampleMethodAsync()
TextBox1.Text = "Task Completed..."
End Sub
Async Function ExampleMethodAsync() As Task
Await Task.Delay(3000)
End Function
حاول ان تضع الكود في حدث Form_Load
PHP كود :
AddHandler Button1.Click,
Async Sub(sender1, e1)
Await ExampleMethodAsync()
TextBox1.Text = vbCrLf & "Task Completed..."
End Sub
لم ينتهي الحديث عن Lambda و هناك الكثير الكثير عنه و يحتاج شرحه و التعمق فيه الى الكثير من الوقت و الجهد
و اتمنى ان اكون قد انرت شمعة لمن يجهل هذا الاسلوب او لمن يحتاج الى معلومات بسيطة عنه
اترك الباقي للمهتمين بالتوسع و اثراء الموضوع بمعرفتهم .
(25-05-17, 11:00 PM)Amir_alzubidy كتب : و عليكم السلام و رحمة اللهشكرا على دعواتك اخي امير و بارك الله فيك و زادك من نعمه
و كل عام و انتم بخير و جميع المسلمين ان شاء الله .
ما شاء الله تبارك الرحمن
يعجبني الاسلوب، و التسلسل و الفن في ايصال المعلومة.
الله يعطيك العافية و يزيدك علم و يرزقك . اللهم آمين
(26-05-17, 12:02 AM)Fantastico كتب : موضوع قيم ومهمجزاك الله بالمثل اخي الكريم
جزاك الله خير
اللهم لك الحمد كما ينبغي لجلال وجهك و عظيم سلطانك
في حل و ترحال


