2014-12-27 244 views
-1

我正在嘗試製作一個程序,它每x分鐘執行一次。我一直在嘗試使用秒錶功能,但它似乎並沒有運行我想要的代碼,當時間到了。每x分鐘運行一次代碼

這裏是我的代碼:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Diagnostics; 
using System.Threading; 

namespace Testing 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      Stopwatch testing = new Stopwatch(); 
      testing.Start(); 

      Thread.Sleep(6001); 
      TimeSpan ts = testing.Elapsed; 
      int timer = Convert.ToInt32(String.Format("{0}", ts.Seconds)); 
      Console.Write(timer); 

      while (testing.Elapsed < TimeSpan.FromMinutes(8)) 
      { 

       timer = Convert.ToInt32(String.Format("{0}", ts.Seconds)); 
       if (timer % 60 == 0) 
       { 
        //run x code every 1 minutes 
        Console.WriteLine("1 min" + timer); 
       } 


       timer = Convert.ToInt32(String.Format("{0}", ts.Seconds)); 
       if (timer % 120 == 0) 
       { 
        //run x code every 2 minutes 
        Console.WriteLine("2 min" + timer); 
       } 
      }  

      testing.Stop(); 
     } 
    } 
} 

回答

1

至於建議的xxbbcc,這裏是一個使用ManualResetEvent.WaitOne()的實現與超時:您的回覆

static void Main(string[] args) 
    { 
     int TimeOut = (int)TimeSpan.FromMinutes(2).TotalMilliseconds; 
     System.Threading.ManualResetEvent mreDuration = new System.Threading.ManualResetEvent(false); 
     Task.Run(() => { 
      System.Threading.Thread.Sleep((int)TimeSpan.FromMinutes(30).TotalMilliseconds); 
      mreDuration.Set(); 
     }); 
     while(!mreDuration.WaitOne(TimeOut)) 
     { 
      Console.WriteLine("Two Minutes..."); 
     } 
     Console.WriteLine("Thirty Mintues!"); 
     Console.ReadLine(); 
    } 
2

Stopwatch是一款高性能定時器(通常具有100ns的分辨率) - 它是你想要做什麼完全不恰當的。 Stopwatch用於通過拍攝系統計數器的快照然後計算差值來測量時間。由於調度程序的大部分工作都是等待工作完成,因此使用緊密循環實現調度程序效率極低 - 系統正在使用CPU資源來決定在大多數情況下不執行任何操作。

要正確實施調度程序(如果這是您要做的),請使用帶有超時選項的ManualResetEvent進行調查。

使用事件會使當前線程進入睡眠狀態(因此不會在系統資源不做任何操作時使用系統資源),並且當超時到期時,觸發事件並且代碼可以調用您正在嘗試調度的函數。

如果您只想告訴您什麼時間間隔已過,您可以使用System.Timers.Timer代替:這樣可以更簡單地安排回調(在計時器到期時調用Elapsed事件),而您不需要在等待期間必須運行一個循環。

編輯:

如果你只是想以定期調用回調函數,一個簡單的定時器更容易掛鉤不是一個事件。下面是使用System.Timer代碼示例(不是我的代碼,我複製&從MSDN粘貼本,上面鏈接):

private static Timer m_oTimer; 

public static void Main() 
{ 
    m_oTimer = new System.Timers.Timer (2 * 1000 * 60); // 2 minutes 
    m_oTimer.Elapsed += OnTimedEvent; // Timer callback 
    m_oTimer.Enabled = true; // Start timer 

    // Wait here (you can do other processing here, too) 
    Console.WriteLine ("Press the Enter key to exit the program... "); 
    Console.ReadLine(); 
    Console.WriteLine ("Terminating the application..."); 
} 

private static void OnTimedEvent (Object source, ElapsedEventArgs e) 
{ 
    // This is called on a separate thread; do periodic processing here 
    Console.WriteLine ("The Elapsed event was raised at {0}", e.SignalTime); 
} 
+0

嗨xxbbcc,謝謝。根據你的建議,我一直在嘗試使用ManualResetEvent,因爲它似乎適合我想要做的更多,但是我只能設法使代碼運行一次使用計時器,我所尋找的是每x分鐘,該代碼將運行一次。 例如,我將程序運行時間設置爲30分鐘。在30分鐘的運行時間內,我希望程序每隔2分鐘重複Console.WriteLine(「2分鐘已到」),直到30分鐘結束。請幫我:) – Konny

+0

@Konny我用'System.Timers.Timer'用一些代碼更新了我的答案。 – xxbbcc

0

您應該使用Timer。如果你希望計時器在停止運行後,比如'y'分鐘,那麼你只需將開始時間存儲在一個變量中,並寫入Timer.Stop()函數,以便在'y'分鐘後執行(提示:將其寫入timer_tick事件中)。定時器的時間段應爲HCF全部爲x's和y。請記住以毫秒爲單位設置時間段。