(Win/C#/.Net) يحتاج التطبيق الصغير إلى الاستقصاء على فترات كل ساعة - توصيات بشأن أفضل طريقة؟

StackOverflow https://stackoverflow.com/questions/1538925

  •  20-09-2019
  •  | 
  •  

سؤال

يحتاج التطبيق الصغير إلى الاستقصاء عن وجود الدليل، على سبيل المثال، كل 1-4 ساعات، وإرسال بضع رسائل بريد إلكتروني/رسائل NET إذا لم يتم العثور عليه.لست متأكدًا من الفاصل الزمني المحدد بعد، لكنه بالتأكيد لن يكون أقل من ساعة واحدة.ستكون "الوظيفة" الشاملة دائمة ومستمرة في المستقبل المنظور.سيتم تشغيل التطبيق الصغير على خادم Win2k3، واستنادًا إلى أنماط استخدام المستخدم (الخفيفة للغاية)، أشك في أنه سيتداخل بأي طريقة ملحوظة مع وظائف الخادم الأساسية، ولكن أريد فقط أن يكون حسن التصرف، بالطبع!تم النظر في تنفيذها كخدمة Win في النهاية، ولكن لأسباب مختلفة، سيكون التنفيذ الأول كتطبيق وحدة تحكم.

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

مراقب نظام الملفات؟
System.Timers.Timer؟
الموضوع.النوم؟
آخر؟

في الواقع، بينما أكتب هذا، يحدث أن أبسط تنفيذ - من وجهة نظر إعادة استخدام "العجلات" العديدة الموجودة بالفعل والتي تم اختراعها بالفعل لهذا النوع من المهام - لن يكون إجراء استطلاع على الإطلاق، ولكن ببساطة تصميمها للبدء، تنفيذ الإجراءات والإغلاق والسماح للبنية الأساسية للمهام المجدولة في Windows بالتعامل مع جانب التوقيت.لكنني نشرت على أي حال للحصول على التحقق من صحة هذه الفكرة + معلومات عامة للرجوع إليها في المستقبل.تاي!

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

المحلول

مهمة Windows المجدولة هي بالتأكيد الطريق الصحيح.و Thread.Sleep(n) هو بالتأكيد لا وسيلة للذهاب.أ System.Timers.Timer سيكون هذا هو الحل الأمثل إذا كنت ستفعل ذلك من داخل التطبيق الخاص بك، بفاصل زمني أولي قدره 3600000.في كل حدث منقضي، يجب عليك تعطيل المؤقت، والقيام بأي تعليمات برمجية تريد القيام بها، ثم إعادة تمكين المؤقت بفاصل زمني يساوي الساعة التالية على مدار الساعة مطروحًا منها وقت النظام الحالي.وإلا فإن جهاز ضبط الوقت الخاص بك سوف يصبح غير متزامن مع وقت النظام (على الرغم من أن هذا قد لا يهم لأغراضك، وفي هذه الحالة سيذهب إلى الجحيم).

نصائح أخرى

استخدم Windows Scheduling Services لجدولة تشغيل تطبيق وحدة التحكم الخاصة بك.قم بإجراء فحص بسيط للدليل باستخدام Directory.Exists وأرسل رسائل البريد الإلكتروني حسب الضرورة.

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

لا داعي للمبالغة في تعقيد الأمور.

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

لقد حاولنا كتابة أدوات مشابهة لخدمات Windows (كما قلت قد يكون التنفيذ المستقبلي) لعدة أسباب:

  • إدارة بسيطة عن بعد عبر NET.EXE (وأخيرًا PowerShell)
  • سهولة المراقبة عبر مدير عمليات مركز النظام (أمي سابقا)
  • يمكن تخزين البيانات/الكائنات مؤقتًا إذا لزم الأمر
  • التوحيد القياسي

لاحظ أننا قمنا بتطوير إطار عمل ونموذج مرتبط به لإنشاء هذه المشاريع؛وبهذه الطريقة لا يتعين على كل مشروع التعامل مع تكوين الفاصل الزمني للاستقصاء، وما إلى ذلك.

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