2012-09-21 97 views
115

可能重複:
How do you add a timer to a C# console application實現「計時器」的最佳方式是什麼?

什麼是實現定時器的最好方法?代碼示例會很棒!對於這個問題,「最好」被定義爲最可靠(最少數量的失火)和精確。如果我指定了15秒的時間間隔,我希望每15秒鐘調用一次目標方法,而不是每10到20秒鐘一次。另一方面,我不需要納秒精度。在這個例子中,該方法每隔14.51-15.49秒就可以接受。

+2

另一大問題被標記爲重複而不指向解釋這口井 – pixel

回答

206

使用Timer類。

https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx

public static void Main() 
{ 
    System.Timers.Timer aTimer = new System.Timers.Timer(); 
    aTimer.Elapsed+=new ElapsedEventHandler(OnTimedEvent); 
    aTimer.Interval=5000; 
    aTimer.Enabled=true; 

    Console.WriteLine("Press \'q\' to quit the sample."); 
    while(Console.Read()!='q'); 
} 

// Specify what you want to happen when the Elapsed event is raised. 
private static void OnTimedEvent(object source, ElapsedEventArgs e) 
{ 
    Console.WriteLine("Hello World!"); 
} 

Elapsed事件將提高毫秒每X量,由定時器對象上的Interval屬性指定。它會叫你指定Event Handler方法,在上面的例子中是OnTimedEvent

+5

是否計時器在一個單獨的線程中執行重複的任何有用的鏈接? –

+7

@VaughanHilts,簡短的回答,是的。長答案,審查[這個SO回答](http:// stackoverflow。com/a/1436331/1630665),它解釋了定時器很好地運行的線程。 –

+3

也許有人比我有更多的優點可以編輯:Interval屬性指定毫秒數,而不是事件之間的秒數。 – Matthias

19

目前尚不清楚,你要開發什麼類型的應用(桌面,Web控制檯...)

的一般的回答,如果你正在開發Windows.Forms申請,是使用

System.Windows.Forms.Timer class。這樣做的好處是它可以在UI線程上運行,所以很簡單,只需定義它,訂閱它的Tick事件並每15秒運行一次你的代碼。

如果你做別的事情,然後Windows窗體(它不是從問題明確),你可以選擇System.Timers.Timer,但一個運行在其他線程,因此,如果您打算採取行動的一些UI元素其Elapsed事件,你必須通過「調用」訪問來管理它。

26

通過使用System.Windows.Forms.Timer類,你可以實現你所需要的。

System.Windows.Forms.Timer t = new System.Windows.Forms.Timer(); 


t.Interval = 15000; // specify interval time as you want 
t.Tick += new EventHandler(timer_Tick); 
t.Start(); 

void timer_Tick(object sender, EventArgs e) 
{ 
     //Call method 
} 

通過使用stop()方法,您可以停止計時器。

t.Stop(); 
+1

如果你有一個,你可以從工具箱中將一個計時器控件拖到你的表單上,它爲你完成上述所有工作。 –

+0

@RobSedgwick是的,我同意你的意見。我們可以通過工具箱添加定時器控制。但我共享的方法是通過運行時添加計時器。 –

2

參考ServiceBase到您的類,並把在OnStart事件下面的代碼:

Constants.TimeIntervalValue = 1(小時)..理想情況下,你應該設置在配置文件中這個值。

StartSendingMails =要在應用程序中運行的函數名稱。

protected override void OnStart(string[] args) 
     { 
      // It tells in what interval the service will run each time. 
      Int32 timeInterval = Int32.Parse(Constants.TimeIntervalValue) * 60 * 60 * 1000; 
      base.OnStart(args); 
      TimerCallback timerDelegate = new TimerCallback(StartSendingMails); 
      serviceTimer = new Timer(timerDelegate, null, 0, Convert.ToInt32(timeInterval)); 
     } 
+0

-1 OP提到了一個控制檯應用程序 - 沒有理由將Windows服務類帶入這個環境。特別是在解決問題時,您使用的是與接受的答案相同的Timer類。 – TarkaDaal

+3

這顯示在服務中,但適用於任何代碼。不要提@TarkaDaal。控制檯沒有在這篇文章中提到。只在可能的情況下重複。 –

相關問題