البرمجة

تأخير الوقت بدون Thread.sleep()

لتحقيق تأخير زمني دقيق بدون استخدام Thread.sleep() في تطبيقك، يمكنك استخدام System.Diagnostics.Stopwatch لقياس مدى الزمن وتحقيق التأخير. هناك أيضًا أسلوب آخر يستخدم ManualResetEvent لتحقيق التأخير. فيما يلي كيفية تنفيذ هذه الطرق:

  1. System.Diagnostics.Stopwatch:
    استخدم Stopwatch لقياس مدى الزمن وتنفيذ التأخير بشكل دقيق. فيما يلي كيفية استخدامه:

    csharp
    Stopwatch stopwatch = new Stopwatch(); stopwatch.Start(); for (n = 0; n <= m; n++) { // Show data // Wait for 30 seconds while (stopwatch.ElapsedMilliseconds < 30000) { // Waiting... } // Reset the stopwatch for the next iteration stopwatch.Restart(); } stopwatch.Stop();
  2. ManualResetEvent:
    يمكنك استخدام ManualResetEvent لتأخير التكرار بشكل دقيق. فيما يلي كيفية تنفيذ ذلك:

    csharp
    ManualResetEvent resetEvent = new ManualResetEvent(false); for (n = 0; n <= m; n++) { // Show data // Wait for 30 seconds resetEvent.WaitOne(30000); // Reset the event for the next iteration resetEvent.Reset(); }

    يجب تهيئة ManualResetEvent في البداية:

    csharp
    resetEvent.Set(); // للسماح بالتأخير في البداية

    وتأكد من استدعاء Set() بعد انتهاء الوقت المحدد لكل تكرار.

    تأكد من استبدال // Show data بالكود الخاص بعرض البيانات وأن تضع الكود الخاص بإعادة ضبط الـ stopwatch أو الـ ManualResetEvent في المكان الصحيح داخل الحلقة for.

المزيد من المعلومات

لتعميق المعرفة في هذا الموضوع، يمكن ذكر المزيد من المعلومات حول كيفية استخدام ManualResetEvent لتحقيق التأخير الدقيق:

ManualResetEvent هو نوع من أنواع الـ events في C#، يمكن استخدامه للسماح بتزامن الأحداث بين الخيوط. عند استخدام ManualResetEvent لتحقيق تأخير، يمكن تعيينه ليكون مفتوحًا (set)، مما يسمح للكود بالمرور دون تأخير، ثم يمكن إعادة تعيينه ليكون مغلقًا (reset) مجددًا لتحقيق التأخير في المرة القادمة.

في الشيفرة السابقة، تم استخدام ManualResetEvent للسماح بتنفيذ الحلقة for بشكل فعال، حيث ينتظر البرنامج لمدة 30 ثانية بعد كل تكرار قبل الانتقال إلى التكرار التالي. WaitOne(30000) تقوم بتعليق الخيط الحالي لمدة 30 ثانية، ثم يتم استئناف التنفيذ بعد انقضاء هذه المدة.

يمكن استخدام ManualResetEvent لأغراض أخرى أيضًا، مثل التنبيه عند اكتمال عملية معينة في خيط آخر أو لتزامن عمليات متعددة في تطبيقات متعددة الخيوط.

مقالات ذات صلة

زر الذهاب إلى الأعلى

هذا المحتوى محمي من النسخ لمشاركته يرجى استعمال أزرار المشاركة السريعة أو تسخ الرابط !!