02-10-12, 01:36 AM
كاتب الموضوع : samerselo
إنشاء العديد من المسارات قد يسبب انخفاض أداء النظام بسرعة وخاصة عندما تصرف هذه المسارات معظم وقتها في حالة سبات أويعاد تشغيلها بصورة دورية بغرض قراءة مصدر ما أو تحديث الإظهار. ولتحسين أداء كودك يمكنك إعادة ترتيب بحيرة المسارات بشكل يضمن أكفأ استخدام للموارد باستخدام بعض الأغراض Objects الموجودة في مجال الأسماء System.Threading بحيرة المسارات
The ThreadPool Type
يتم إنشاء بحيرة المسارات عندما تقوم باستدعاء الدالة ThreadPool.QueueUserWorkItem والتي تحتاج لإجراء مفوض WaitCallback delegate وغرض Object اختياري يستخدم لتمرير البيانات للمسار والإجراء المفوض يجب أن يشير إلى Sub يمرر له بارامتر وحيد من النوع Object بحيث تكون قيمته محتوية على البيانات التي نريد تمريرها للمسار أو Nothing عندما لا توجد بيانات نريد تمريرها وقطعة الكود التالية تبين لك كيف يمكنك استخدام عدد كبير من المسارات لاستدعاء إجراء في فئة Class
كود :
For i As Integer = 1 To 20
' Create a new object for the next lightweight task.
Dim task As New LightweightTask()
' Pass additional information to it. (Not used in this demo.)
task.SomeData = "other data"
' Run the task with a thread from the pool. (Pass the counter as an argument.)
ThreadPool.QueueUserWorkItem(AddressOf task.Execute, i)
Next
كود :
Class LightweightTask
Public SomeData As String
' The method that contains the interesting code
' (Not really interesting in this example)
Sub Execute(ByVal state As Object)
Console.WriteLine("Message from thread #{0}", state)
End Sub
End Class
كود :
' Maximum 30 worker threads and maximum 10 asynchronous I/O threads in the pool
ThreadPool.SetMaxThreads(30, 10)
The Timer Type
تقدم الفريموورك عدة أنواع من المؤقتات كل منها يمتلك نقاط قوته وضعفه. فمثلا يجب عليك استخدام التحكم System.Windows.Forms.Timer عندما تقوم بالعمل على تطبيق من النوع Windows Forms applications وإن لم يكن برنامجك يمتلك واجهة للمستخدم يجب عليك عندها استخدام الفئة System.Threading.Timer أو الفئة System.Timers.Timer وتعتبر هاتان الفئتان متساويتين في العمل تقريبا والشرح التالي على System.Threading.Timer ينطبق أيضا على System.Timers.Timer
الفئة Timer في مجال الأسماء System.Threading يقدم طريقة بسيطة لمؤقت يستدعي إجرائية محددة حيث يمكنك استخدام هذه الفئة لجدولة عمل في وقت معين في المستقبل ويمكن تنفيذه بالتكرار الذي تحتاجه مهما يكن ابتداء من مرة واحدة فما فوق وباني المؤقت يأخذ أربعة بارامترات:
• إجراء مفوض TimerCallback delegate يشير إلى الإجراء الذي يستدعى عندما ينتهي زمن المؤقت ويجب أن يكون هذا الإجراء من النوع Sub يأخذ بارامتر واحد من النوع Object
• غرض Object يتم تمريره للإجراء الذي يشير إليه المفوض ويمكن أن يكون من عدة أنواع كسلسلة نصية أو مصفوفة أو مجموعة Collection أو أي نوع بيانات آخر يحتوي على البيانات التي سيتم تمريرها للإجراء وإن لم تكن تحتاج لتمرير قيم استخدم Nothing بكل بساطة
• قيمة من النوع TimeSpan تحدد زمن المؤقت الذي سيتم استدعاء الإجراء بعده كما يمكن تحديدها باستخدام قيمة من النوع Long أو UInteger وفي هذه الحالة يقاس الزمن بالميللي ثانية (1/1000 من الثانية) وعند تمرير Timeout.Infinite كقيمة لا يتم إطلاق المؤقت أبدا أو القيمة 0 صفر لإطلاق المؤقت مباشرة
• قيمة من النوع TimeSpan تحدد زمن المؤقت والتي بدورها تحدد زمن تكرار إطلاق المؤقت بعد المرة الأولى. وهذه أيضا يمكن تحديدها بقيمة من النوع Long أو UInteger وهنا أيضا يصبح الوقت مقاسا بالميللي ثانية ويمكنك تمرير القيمة 1 أو Timeout.Infinite لإطلاق المؤقت مرة واحدة فقط.
وهذه القيم التي تمررها لباني المؤقت غير متوفرة كخصائص. وبعد تشغيل المؤقت يمكنك تغيير هذه القيم فقط باستخدام الطريقة Change method والتي تأخذ بارامترين يحددان وقت التشغيل وفترة زمن المؤقت ويمتلك Timer object إجراء Stop الذي يقوم بإيقاف المؤقت الذي يتم إيقافه عبر استدعاء الإجراء Dispose وترينا قطعة الكود التالية مثالا عما تحدثنا عنه حول المؤقت
كود :
Sub TestThreadingTimer()
' Get the first callback after one second.
Dim dueTime As New TimeSpan(0, 0, 1)
' Get additional callbacks every half second.
Dim period As New TimeSpan(0, 0, 0, 0, 500)
' Create the timer.
Using t As New Timer(AddressOf TimerProc, Nothing, dueTime, period)
' Wait for five seconds in this demo, and then destroy the timer.
Thread.Sleep(5000)
End Using
End Sub
' The callback procedure
Sub TimerProc(ByVal state As Object)
' Display current system time in console window.
Console.WriteLine("Callback proc called at {0}", Date.Now)
End Sub