سؤال

أنا أكتب تطبيقًا سيحتاج إلى الاستفادة منه Timers، ولكن من المحتمل أن يكون هناك عدد كبير جدًا منهم.ما مدى قابلية التوسع System.Threading.Timer فصل؟تقول الوثائق فقط أنها "خفيفة الوزن"، لكنها لا تشرح المزيد.هل يتم امتصاص هذه الموقتات في مؤشر ترابط واحد (أو مؤشر ترابط صغير جدًا) يقوم بمعالجة جميع عمليات الاسترجاعات نيابة عن Timer, ، أو يفعل كل منهما Timer لها موضوع خاص بها؟

أعتقد أن هناك طريقة أخرى لإعادة صياغة السؤال وهي:كيف هو System.Threading.Timer مُنفّذ؟

هل كانت مفيدة؟

المحلول

أقول هذا ردا على الكثير من الأسئلة:لا تنس أن الكود المصدري (المُدار) لإطار العمل متاح.يمكنك استخدام هذه الأداة للحصول على كل شيء: http://www.codeplex.com/NetMassDownloader

لسوء الحظ، في هذه الحالة تحديدًا، يتم تنفيذ الكثير من التعليمات البرمجية الأصلية، لذا لا يمكنك إلقاء نظرة عليها...

إنهم بالتأكيد يستخدمون مؤشرات الترابط المجمعة بدلاً من مؤشر الترابط لكل مؤقت.

الطريقة القياسية لتنفيذ مجموعة كبيرة من المؤقتات (وهي الطريقة التي تقوم بها النواة بذلك داخليًا، وأظن أنها الطريقة غير المباشرة التي تنتهي بها مجموعتك الكبيرة من المؤقتات) هي الحفاظ على القائمة مرتبة حسب الوقت حتى انتهاء الصلاحية - لذلك يجب على النظام فقط أن يقلق بشأن التحقق من المؤقت التالي الذي ستنتهي صلاحيته، وليس القائمة بأكملها.

تقريبًا، هذا يعطي O(log n) لبدء تشغيل المؤقت وO(1) لمعالجة مؤقتات التشغيل.

يحرر:لقد كنت أبحث للتو في كتاب جيف ريختر.يقول (من Threading.Timer) أنه يستخدم خيطًا واحدًا لجميع كائنات المؤقت، يعرف هذا الخيط متى يأتي المؤقت التالي (أي.كما هو مذكور أعلاه) مستحق ويستدعي ThreadPool.QueueUserWorkItem لعمليات الاسترجاعات حسب الاقتضاء.يؤدي هذا إلى أنه إذا لم تنته من خدمة رد اتصال واحد على جهاز ضبط الوقت قبل استحقاق الرد التالي، فسيتم إعادة إدخال رد الاتصال الخاص بك في مؤشر ترابط تجمع آخر.لذا باختصار، أشك في أنك سترى مشكلة كبيرة في وجود الكثير من أجهزة ضبط الوقت، ولكن قد تعاني من استنفاد تجمع مؤشرات الترابط إذا تم إطلاق أعداد كبيرة منها في نفس المؤقت و/أو كانت عمليات رد الاتصال الخاصة بها بطيئة.

نصائح أخرى

أعتقد أنك قد ترغب في إعادة التفكير في تصميمك (أي إذا كان لديك القدرة على التحكم في التصميم بنفسك).إذا كنت تستخدم عددًا كبيرًا جدًا من أجهزة ضبط الوقت مما يشكل مصدر قلق بالنسبة لك، فمن الواضح أن هناك بعض الإمكانية للدمج هناك.

فيما يلي مقالة جيدة من مجلة MSDN منذ بضع سنوات تقارن بين فئات المؤقت الثلاثة المتاحة، وتعطي فكرة عن تطبيقاتها:

http://msdn.microsoft.com/en-us/magazine/cc164015.aspx

توحيدها.قم بإنشاء خدمة مؤقت واطلب ذلك عن أجهزة ضبط الوقت.سوف تحتاج فقط إلى الحفاظ على جهاز توقيت نشط واحد (للمكالمة المستحقة التالية) ...

لكي يكون هذا تحسينًا على مجرد إنشاء الكثير من كائنات Threading.Timer، عليك أن تفترض أن هذا ليس بالضبط ما يفعله Threading.Timer داخليًا بالفعل.سأكون مهتمًا بمعرفة كيف توصلت إلى هذا الاستنتاج (لم أقم بتفكيك الأجزاء الأصلية من إطار العمل، لذا قد تكون على حق).

^^ كما يقول داني سمورف :توحيدها.أنشئ خدمة مؤقت واطلب ذلك من أجل المؤقتات.سيحتاج فقط إلى الاحتفاظ بمؤقت واحد نشط (للمكالمة المستحقة التالية) وسجل بجميع طلبات المؤقت وإعادة حساب ذلك على AddTimer() / RemoveTimer().

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top