تقييم الموضوع :
  • 0 أصوات - بمعدل 0
  • 1
  • 2
  • 3
  • 4
  • 5
استخدام بحيرة المسارات Using the Thread pool
#1
كاتب الموضوع : 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
والمسار العامل يمكنه تحديد فيما إذا كان قد أخذ من بحيرة المسارات أم لا بتحري قيمة الخاصية Thread.CurrentThread.IsThreadPoolThread ويمكنك معرفة العدد الأقصى للمسارات في البركة باستدعاء الطريقة الساكنة ThreadPool.GetMaxThreads وعدد المسارات المتاحة حاليا باستدعاء الطريقة الساكنة ThreadPool.GetAvailableThreads . كما تم إضافة طريقة جديدة SetMaxThreads في الفريموورك 2 .NET Framework 2.0 تمكنك من تغيير العدد الأقصى للمسارات الموجودة في البركة

كود :
' Maximum 30 worker threads and maximum 10 asynchronous I/O threads in the pool
ThreadPool.SetMaxThreads(30, 10)
في بعض الأحيان قد تحتار في نقطة تساؤل هل أقوم بإنشاء المسار بنفسي أم أستعيره من بحيرة المسارات. وتظهر هنا قاعدة جيدة: استخدم فئة المسارات Thread class عندما تريد تنفيذ عملية تريد تنفيذها بأسرع وقت أو عندما تريد القيام بعملية تستهلك الوقت ولا يتم تنفيذها كثيرا وفي معظم الحالات بشكل عام يجب عليك استخدام بحيرة المسارات.

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
وفي النهاية تجدر ملاحظة أن الإجراء المستدعى يتم تنفيذه على مسار مأخوذ من بركة المسارات لذا يجب عليك التحكم بالمتغيرات والمصادر الأخرى المستخدمة من قبل المسار الرئيسي للبرنامج عبر استخدام ما يدعى بتزامن المسارات
}}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [مقال] لنعيد إجراءات وسهولة استخدام ADODB في ADO.NET ebrahem b alabdaly 5 1,481 13-03-15, 09:54 PM
آخر رد: abdala
  [مقال] كلام في استخدام الدوال والروتينات function and sub سعود 4 1,232 04-05-14, 11:06 PM
آخر رد: Ali Wisam
  كيفية استخدام ملف التعريف الخاص بالتطبيق لاستهداف نسخة معينة من الفريموورك- ينطبق على RaggiTech 0 363 05-10-12, 01:46 AM
آخر رد: RaggiTech
  ملاحظة سريعة - تمكين برنامجك من استخدام صلاحيات مدير على فيستا RaggiTech 0 421 05-10-12, 01:31 AM
آخر رد: RaggiTech
  يمكننا استخدام فيجول بايزيك 2008 لإنشاء صفحات أشرطة إضافية لـ Excel 2007 RaggiTech 0 352 05-10-12, 01:14 AM
آخر رد: RaggiTech
  تزامن المسارات Thread Synchronization RaggiTech 2 520 03-10-12, 08:35 AM
آخر رد: RaggiTech
  التعامل مع Resources و image list الاستغناء عن المسارات RaggiTech 1 848 02-10-12, 10:58 AM
آخر رد: RaggiTech
  استخدام كود فيجول بيزيك دوت نيت في فيجول بيزيك 6 RaggiTech 0 340 02-10-12, 01:42 AM
آخر رد: RaggiTech
  استخدام كود فيجول بيزيك 2005 في فيجول بيزيك 6 RaggiTech 0 332 02-10-12, 01:41 AM
آخر رد: RaggiTech
  استخدام زر HelpButton في دالة MessageBox RaggiTech 0 351 02-10-12, 01:39 AM
آخر رد: RaggiTech

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم