السلام عليكم ورحمة الله وبركاته :
يمكن أغلبنا سمع عن الـ Threading لكن أعتقد ان الكثير لم يسمع عن Asynchronous Pattern أو بالعربي نمط اللاتزامن وهي نفس فكرة الـ Threading ولمن لا يعرف ما هو الـ Threading فباختصار الـ Threading هو أن تجعل برنامجك يقوم بمجموعة بتفيذ Sub Procedure في مسار يختلف عن المسار الذي يتم فيه تنفيذ البرنامج داخل الـ Processor المعالج حتي لا يتسبب في جعل البرنامج يتجمد ويتوقف عن الاستجابة (وتظهر الشاشه البيضاء وعباره Not Responding في شريط العنوان ) ولتعلم أهميتها حاول أن تكتب نص كبير من متغير الي ملف نصي بالطريقة المعتاده وأنظر ماذا سيحدث ؟؟؟ ولعمل Thread في برنامجك اتبع الخطوات التاليه :
في حدث النقر علي زر مثلا أنشئ Object من النوع Thread ثم مرر لها الـ Sub Procedure التي تريد تنفيذها في مسار غير مسار البرنامج :
Dim th As New Threading.Thread(AddressOf msg)
ثم قم بعمل تشغيل للـ Thread :
th.Start()
وقبل كل ذلك أنشئ Sub فيها خطوات الكتابة الي ملف نصي أو اظهار رساله علي سبيل المثال :
Sub msg()
MsgBox("Cool")
End Subوالآن ننتقل الي الـ Asynchronous Pattern :
الـ Asynchronization أو اللاتزامن وهو فكره شبيهه أونفس فكرة الـ Threading ,
في بعض الـ NET Framework Classes. نجد بها Methods بالشكل التالي BeginXXX و EndXXX حيث XXX هي الوظيفة التي تؤديها الـ Method بطريقة لا تزامنيه , معني وجود Methods بهذا الشكل في Class معينه يعني أن هذه الـ Class تدعم الـ Asynchronous Pattern , علي سبيل المثال في الـ FileStream Class توجد الـ Methods التاليه BeginRead,BeginWrite,EndRead,EndWrite ونستنتج أنه يمكن الكتابة أو القراءة عن طريق هذه الـ Class بنمط اللاتزامن (وهذه تكون مفيده جدا عند عمل برامج للشبكات في ارسال واستقبال البيانات) علي سبيل المثال لاستخدام الـ Methods التاليه BeginRead,EndRead , اتبع الخطوات التاليه :
قم بتعريف مصفوفه من النوع Byte لاستقبال البيانات من الملف عن طريق الـ FileStream ,
قم بتعريف متغير من النوع FileStream , قم بتعريف متغير من النوع AsyncCallback Delegate :
Dim arr() As Byte Dim fs As IO.FileStream Dim Callback As AsyncCallback
في حدث النقر علي زر مثلا :
قم بانشاء Object من الـ AsyncCallback التي قمنا بتعريف متغير منها والتي تأخذ Sub Procedure كمعامل (اتركه الآن 1),
ثم قم بانشاء Object من الـ FileStream الذي عرفناه واعطاؤه المتغيرات اللازمة لقراءة ملف معين (اتركه الآن 2),
ثم قم بعمل ReDim للمصفوفه لاعطاءها (طول البيانات التي ستستقبلها من الـ FileStream) ,
ثم قم ببدء عملية القراءه من الـ FileStream عن طريق استخدام الـ Method BeginRead (اتركه الآن 3),
عند انشاء Object من الـ AsyncCallback كالتالي : الجزء (اتركه الآن 1) ,
Callback = New AsyncCallback(AddressOf endcallback)
سنجد أنها تأخذ Sub Procedure عن طريق المعامل AddressOf , هذه الـ Sub تأخذ متغير من النوع IAsyncResult وهي Interface وذلك لكي نستخدم الخاصيه AsyncState الخاصه بها , فيكون شكل الـ Sub كالتالي :
Sub endcallback(ByVal ar As IAsyncResult) End Sub
وفي داخل الـ Sub سوف نكتب الكود الذي ينهي القراءة من الـ FileStream (اتركه الآن 4),
وعند انشاء Object من الـ FileStream سيكون الشكل كالتالي : الجزء (اتركه الآن 2) ,
fs = New IO.FileStream("C:\asyn.txt", IO.FileMode.Open, IO.FileAccess.Read, IO.FileShare.Read, 4096, True)وعند بدء عملية القراءة من الـ FileStream عن طريق الـ BeginRead Method يكون شكل الكود كالتالي : الجزء (اتركه الآن 3) ,
fs.BeginRead(arr, 0, arr.Length, Callback, fs)
أما بالنسبه للكود داخل الـ Sub وفيه ننهي القراءة عن طريق استخدام الـ EndRead Method فيكون كالتالي : لجزء (اتركه الآن 3) ,
Dim fs As IO.FileStream fs = ar.AsyncState fs.EndRead(ar) fs.Close() MsgBox(System.Text.Encoding.UTF8.GetString(arr))
أنا عارف ان الموضوع دخل في بعضه لكن والله هذه هي الطريقه الوحيده اللي قدرت أشرح بيها الموضوع لكن لو نظرتوا للكود في المثال المرفق ستجدوا الموضوع سهل وبسيط ان شاء الله ,
الموضوع قد يحتمل وجود أخطاء فلا تترد في تنبيهي وتصحيحها , المثال علي 2003 ,أرجو منكم الدعاء ,,,


