مؤقتات .NET:ما هي أفضل طريقة ليتم إعلامك خلال X ثانية؟

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

  •  02-07-2019
  •  | 
  •  

سؤال

لنفترض أن لدي حدثًا غير متكرر يجب رفعه لمدة X ثانية من الآن مثل انتهاء المهلة.بديهيًا، سيكون من المنطقي إنشاء System.Timers.Timer، وضبط الفاصل الزمني الخاص به على X*1000، وربط علامة التجزئة الخاصة به بالحدث وبدء تشغيله.نظرًا لأن هذا حدث غير متكرر وتريد رفعه مرة واحدة فقط، فسيتعين عليك إيقاف المؤقت بعد مروره.

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

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

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

المحلول

هذا البناء بالنسبة لـ System.Threading.Timer يسمح لك بتحديد ملف فترة.إذا قمت بتعيين هذه المعلمة على -1، فسيتم تعطيل الإشارات الدورية وتنفيذها مرة واحدة فقط.

public Timer(
    TimerCallback callback,
    Object state,
    TimeSpan dueTime,
    TimeSpan period
)

نصائح أخرى

ما عليك سوى استخدام مؤقت عادي وتعطيله بعد انقضاءه مرة واحدة.هذا يجب ان يحل مشكلتك.

كلاهما، system.threading.timer وsystem.timers.timer يدعمان ذلك.

قم بتدوير عامل الخلفية الجديد، والنوم، والإغلاق.

var worker = new BackgroundWorker();
worker.DoWork += delegate {
  Thread.Sleep(30000); 
  DoStuff();
} 
worker.RunWorkerAsync();

يمكنك استخدام System.Timers.Timer مع AutoReset = true، أو System.Threading.Timer مع فترة لا نهائية (System.Threading.Timeout.Infinite = -1) لتنفيذ مؤقت مرة واحدة.

في كلتا الحالتين، يجب عليك التخلص من المؤقت الخاص بك عند الانتهاء منه (في معالج الأحداث لـ Timers.Timer أو رد الاتصال لـ Threading.Timer) إذا لم يكن لديك فاصل زمني متكرر.

ما عليك سوى ضبطها لوضع علامة بعد X ثانية، وفي رمز العلامة، قم بما يلي:

timer.enabled = false;

عملت بالنسبة لي.

إذا كنت تريد قياسًا دقيقًا للوقت، فيجب أن تفكر في مضاعفة تردد المؤقت واستخدام DateTime.Now للمقارنة بوقت البدء.الموقتات وThread.Sleep ليست بالضرورة دقيقة في قياسات الوقت الخاصة بها.

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