- 0
سجل دخول لمتابعه هذا
متابعين
0

Asynchronous Programming
بواسطة
VB Helper,
-
يستعرض القسم حالياً 0 members
لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .
بواسطة
VB Helper,
لا يوجد أعضاء مسجلين يشاهدون هذه الصفحة .
تم النشر منذ (معدل)
السلام عليكم ورحمه الله وبركاته
هل سمعت يوما ما بالبرمجة المتزامنة او الغير متزامنة؟ اذا سمعت بها من قبل فمن الممكن ان تستفيد شيئا جديدا في هذا الدرس, واذا لم تسمع بها من قبل فإنك ستكتشف بعض الاسرار الغامضه في مجال البرمجة.
لنلقي نظرة على المثال التالي
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شارك هذا الرد
رابط المشاركة
شارك الرد من خلال المواقع ادناه