الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

Asynchronous Programming

مثبّت
بدأه VB Helper في 16 يونيو 2011 · 20 رد · 8,765 مشاهدة · في Microsoft Visual Basic.NET
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم ورحمه الله وبركاته

هل سمعت يوما ما بالبرمجة المتزامنة او الغير متزامنة؟ اذا سمعت بها من قبل فمن الممكن ان تستفيد شيئا جديدا في هذا الدرس, واذا لم تسمع بها من قبل فإنك ستكتشف بعض الاسرار الغامضه في مجال البرمجة.

لنلقي نظرة على المثال التالي


Dim req = WebRequest.Create("http://www.google.com")
Using resp As WebResponse = req.GetResponse()
Using strm As New StreamReader(resp.GetResponseStream())
Console.WriteLine(strm.ReadToEnd())
End Using
End Using

ما هو إلا مثال بسيط يقوم بإنشاء طلب من الموقع قوقل ومن ثم قمنا بإنشاء Stream ليقرأ الإستجابة لطلبنا وفي مثالنا هو صفحة قوقل الرئيسية ومن ثم قمنا بطباعة محتوى هذا ال Stream من البداية إلى النهاية بمعنى آخر قمنا بطباعة محتوى الصفحة الرئيسية والذي في الاساس هو html ,نلاحظ عند تنفيذ البرنامج السابق سينتظر البرنامج لبرهه زمنية إلى أن يتم جلب محتوى الصحفة من الموقع المطلوب بمعنى ان الكود سوف يعمل إعتراض للبرنامج إلى ان يتم تنفيذ الكود السابق (Block), فالكود السابق يعتبر كود متزامن أي ان البرنامج يقف إلى حين تنفيذ الكود اللازم. فالكود السابق لن يعمل في تقنية السلفرلايت لأنها تدعم البرمجة الغير متزامنة.

فالبرمجة الغير متزامنة هي عكس المتزامنة أي انها لاتعيق سير البرنامج, طبعا لننتقل إلى برمجة الويندوز فإذا تم تنفيذ الكود اعلاه فإن البرنامج سيدخل في مرحلة غير الاستجابة وسترى أن نافذة البرنامج معلقة!! لماذا؟ لأن البرنامج يشتغل في مسلك Thread واحد, سيقول البعض سأقوم بإنشاء مسلك أخر للعملية فلن يعيق سير البرنامج .. كلام صحيح ولكن قبل ان تغامر بهذه المحاولة اسأل نفسك لو كنت تريد جلب المئات او الآلاف من الصفحات هل ستنشىء مسلك لكل عملية جلب؟!! إذا قلت نعم لتعلم ان كل مسلك يأخد مساحة قدرها 1 ميجابايت يعني لو استخدمت ألف Thread فإنك استغرقت قرابة 1 جيجابايت!! امر عجيب صح!! وكم يا ترى حجم ذاكرتك لذا فهذ الاسلوب غير مجدي في بعض انواع البرمجة. لنفترض اننا نستخدم تقنية ال ASP.NET فخادم التقنية IIS يقوم بتنفيذ اكثر من طلبية فتخيل ان مستخدم ما استخدم 100 مسلك مثلا فكم من المساحة سوف تسنغرق من الخادم لو كان يتعامل مع الآلاف من المستخدمين؟!! كارثة بلاشك!!

الآن سنقوم بتحويل المثال السابق باستخدام البرمجة الغير المتزامنة


Dim req = WebRequest.Create("http://www.google.com")
req.BeginGetResponse(AddressOf callback, req)

نرى في الكود السابق تم إستخدام الدالة الغير متزامنة BeginGetResponse والتي تقوم بتمرير الطلب والمندوب ليقوم بمعالجة الطلب وينفذ الدالة Callback الاستدعاء المرجعي وكود الداله على الصورة التالية


Sub callback(ByVal ir As IAsyncResult)
Dim req As WebRequest = DirectCast(ir.AsyncState, WebRequest)
Using resp As WebResponse = req.EndGetResponse(ir)
Using strm As New StreamReader(resp.GetResponseStream())
Console.WriteLine(strm.ReadToEnd())
End Using
End Using
End Sub

كما نرى قمنا بتحويل الواجهه AsyncState التي تمثل العملية الغير متزامنة وفي حالتنا WebRequest ومن ثم قمنا بنفس السيناريو السابق لطباعة محتوى الصفحة.

وقبل الختام اريد ان اريكم الميزه الموجود في الاصدار الرابع من الدوت نت والتي تخدم البرمجة الغير متزامنة عبر ال Lambda, لنلقي نظرة على المثال التالي


Dim req = WebRequest.Create("http://www.google.com")
req.BeginGetResponse(Sub(ir)
Using resp As WebResponse = req.EndGetResponse(ir)
Using strm As New StreamReader(resp.GetResponseStream())
Console.WriteLine(strm.ReadToEnd())
End Using
End Using
End Sub, req)

نلاحظ من المثال اعلاه وباستخدام ال Multiline Lamdba لانحتاج مندوب ليقوم بالتأشير على الاستدعاء المرجعي وانما يمكننا عبرها من كتابة الكود كوسيط للدالة المتزامنة. ولقد ارفقت مشروع يوضح استخدام البرمجة المتزامنة والبرمجة الغير متزامنة باستخدام المسلك والبرمجة الغير متزامنة باستخدام ال AsyncCallBack وال Multiline Lambda

في الختام ارجو ان فهمتم البرمجة الغير متزامنة وفائدتها في بيئة الدوت نت خاصة

Asynchronous Programming.zip

تم تعديل هذه المشاركة بواسطة VB Helper في 17 يونيو 2011 في 18:04

11

.:: Wish to become better and better ::.

#2

أحسنت أخي

هذا الموضوع جدا مهم وخصوصا في البرمجه الحديثه او البرامج التى نحتاج الى تشغيل أكثر من عمليه في وقت واحد مع ابقاء البرنامج ينجاوب مع المستخدم , وأقول لك وللجميع هذا الموضوع سابقا كان كارثه لنا عندما كنا نصنع برامج كبيره ولها عدة عمليات يجب ان تعمل في نفس الوقت وابقاء البرنامج متجاوبا مع المستخدم

نرجو من الجميع التركيز على هكذا مواضيع لما فيها من فائده ولما فيها من فائده مستقبليه ايضا حيث انها ستكون مستقبل البرمجه .

1 −1
#3

السلام عليكم ورحمه الله وبركاته

اشكرك اخ عصام على مرورك بالتأكيد البرمجة الغير متزامنة هي واحد من المواضيع المهمه في عالم البرمجه ولكن الكثير منا يجهلها!!

1 −1

.:: Wish to become better and better ::.

#4

شكرا لك يا استاذ تم التقييم

#5

السلام عليكم ورحمه الله وبركاته

شكرا اختي .. ان شاء الله تكون وصلت فكرة البرمجة الغير متزامنة ..

.:: Wish to become better and better ::.

#6

السلام عليكم ورحمه الله وبركاته

اريد ان انوه ان مايكروسوفت اضافة ال Async CTP للفيجوال ستديو 2010 لدعم اكبر للبرمجه الغير متزامنه, كما اردت ان اذكر انها من اهم الميزات التي تركز عليها مايكروسوفت في الاصدار الخامس للدوت نت, يرجى متابعة الرابط التالي http://msdn.microsoft.com/en-us/vstudio/gg316360

2

.:: Wish to become better and better ::.

#7

بارك الله فيك اخ هيلبر

ممكن كمان نفس البرنامج بالويندز ابليكشن

#8

السلام عليكم ورحمه الله وبركاته

اختي ماهو المرفق تطبيق ويندوز؟!! اما البرنامج المشروح يمكن تنفيذ نفس الكود برضه في تطبيق ويندوز

.:: Wish to become better and better ::.

#9
VB Helper كتب:

السلام عليكم ورحمه الله وبركاته

اختي ماهو المرفق تطبيق ويندوز؟!! اما البرنامج المشروح يمكن تنفيذ نفس الكود برضه في تطبيق ويندوز

وعليكم السلام ورحمة الله وبركاته

اها شكرا اخ هيلبر انا حملته بس مافتحته

تم تعديل هذه المشاركة بواسطة دمعة فراق في 22 يوليو 2011 في 16:03

#10

السلام عليكم ورحمه الله وبركاته

اختي انا مستخدم فيجوال ستديو 2010 اذا لم يفتح معاك قومي باضافة الفورم الى مشروع جديد من خلال Add Existing Item

.:: Wish to become better and better ::.

#11
VB Helper كتب:

السلام عليكم ورحمه الله وبركاته

اختي انا مستخدم فيجوال ستديو 2010 اذا لم يفتح معاك قومي باضافة الفورم الى مشروع جديد من خلال Add Existing Item

وعليكم السلام ورحمة الله وبركاته

اوكي اخ هيلبر بس في البروقرس بار مافي شي (فاضي) ع اي بوتم نضغط عشان يمشي :wacko:

جزاك الله خير

#12

السلام عليكم ورحمه الله وبركاته

اختي كلما تنقري زر من الازرار يتنفذ كود استدعاء الدالة بسلوك مختلف وبالتالي يتحرك شريط التقدم ليبين كم مضى من العملية!!

.:: Wish to become better and better ::.

#13

السلام عليكم ورحمة الله وبركاته.

+1 رااااائع جداً , جزاك الله خير VB Helper دائماً مواضيعك مميزة .

فعلاً موضوع مهم جدا خصوصاً اني عانيت من هالمشكلة قبل كذا ,,,

عموماً تم حفظ الموضوع في ملف وورد للرجوع اليه وقت الحاجة , اعتقد احتاج اطبق الموضوع على اكثر من برنامج عشان استوعب الفكرة اكثر.

 Private Sub btnCallback2008_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCallback2008.Click
        Dim ac As New AsyncCallback(AddressOf CallBack)
        mi = New MethodInvoker(AddressOf LongRunningMethod)
        mi.BeginInvoke(ac, Nothing)
    End Sub

حابة اسأل في هذا السطر

mi.BeginInvoke(ac, Nothing)

ليش مررت في الباراميتر الثاني Nothing ؟؟؟

و متى نمرر اوبجكت ,و مثل ايش ؟؟؟

((إِنَّ اللَّهَ وَمَلائِكَتَهُ يُصَلُّونَ عَلَى النَّبِيِّ يَا أَيُّهَا الَّذِينَ آمَنُوا صَلُّوا عَلَيْهِ وَسَلِّمُوا تَسْلِيمًا))

#14

السلام عليكم ورحمه الله وبركاته

لاشكرا على واجب اختي

يمكنك الاستفادة من خاصية المفضلة بالمنتدى لحفظ المواضيع المميزة لك, اما بالنسبة للمتغير من نوع Object اذا تم تمريره للاجراء يمكنك الوصول اليه من خلال الخاصيه AsyncState وفي مثال لم احتاج لتمرير قيمة ما للاجراء فقمت بوضع Nothing

.:: Wish to become better and better ::.

#15
VB Helper كتب:

السلام عليكم ورحمه الله وبركاته

لاشكرا على واجب اختي

يمكنك الاستفادة من خاصية المفضلة بالمنتدى لحفظ المواضيع المميزة لك, اما بالنسبة للمتغير من نوع Object اذا تم تمريره للاجراء يمكنك الوصول اليه من خلال الخاصيه AsyncState وفي مثال لم احتاج لتمرير قيمة ما للاجراء فقمت بوضع Nothing

عليكم السلام ورحمة الله وبركاته.

جزاك الله خير , و الله يزيدك من فضله و يبارك لك في علمك.

تمت اضافة الموضوع للمفضلة.

((إِنَّ اللَّهَ وَمَلائِكَتَهُ يُصَلُّونَ عَلَى النَّبِيِّ يَا أَيُّهَا الَّذِينَ آمَنُوا صَلُّوا عَلَيْهِ وَسَلِّمُوا تَسْلِيمًا))

#16

هل هذه التقنية موجودة في .Net 3.5؟؟؟

#17

السلام عليكم ورحمه الله وبركاته لاشكر على واجب اختي .. بالتوفيق .. اخي بهاء المثال المرفق يوضح مختلف الطرق لعمل الـ Async, يرجى مراجعة المثال, ولا اخفي بالذكر فهي اكبر ميزة ستظهر في الاصدار 4.5

.:: Wish to become better and better ::.

#18

جزاك الله خيرا أخوي، بارك الله فيك

..:: رَبِّ زِدْني عِلْمًا ::..

#19

السلام عليكم ورحمه الله وبركاته

لاشكر على واجب اخي .. بالتوفيق ..

.:: Wish to become better and better ::.

#20

مرحبا

أولا جزاك الله خير

ثانيا عندي سؤال

حاليا عندي مشروع شبكات، (والمفروض بشكل متزامن) يكون عندي اكثر من nodes are woken up

بحيث اقوم باختبار جميع العقدالمستيقظة

بس برمجيا افترضت ان عندي عقدة وحدة مستيقظة وهي اللي انفذ عليها خطوات برنامجي

هل المثال المدرج ممكن استفيد منه في هذا النوع من البرامج؟

وشكرا

#21

جزاك الله خيرا ..

مواضيع مشابهة