可能重複:
How do you add a timer to a C# console application實現「計時器」的最佳方式是什麼?
什麼是實現定時器的最好方法?代碼示例會很棒!對於這個問題,「最好」被定義爲最可靠(最少數量的失火)和精確。如果我指定了15秒的時間間隔,我希望每15秒鐘調用一次目標方法,而不是每10到20秒鐘一次。另一方面,我不需要納秒精度。在這個例子中,該方法每隔14.51-15.49秒就可以接受。
可能重複:
How do you add a timer to a C# console application實現「計時器」的最佳方式是什麼?
什麼是實現定時器的最好方法?代碼示例會很棒!對於這個問題,「最好」被定義爲最可靠(最少數量的失火)和精確。如果我指定了15秒的時間間隔,我希望每15秒鐘調用一次目標方法,而不是每10到20秒鐘一次。另一方面,我不需要納秒精度。在這個例子中,該方法每隔14.51-15.49秒就可以接受。
使用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
是否計時器在一個單獨的線程中執行重複的任何有用的鏈接? –
@VaughanHilts,簡短的回答,是的。長答案,審查[這個SO回答](http:// stackoverflow。com/a/1436331/1630665),它解釋了定時器很好地運行的線程。 –
也許有人比我有更多的優點可以編輯:Interval屬性指定毫秒數,而不是事件之間的秒數。 – Matthias
目前尚不清楚,你要開發什麼類型的應用(桌面,Web控制檯...)
的一般的回答,如果你正在開發Windows.Forms
申請,是使用
System.Windows.Forms.Timer class。這樣做的好處是它可以在UI
線程上運行,所以很簡單,只需定義它,訂閱它的Tick事件並每15秒運行一次你的代碼。
如果你做別的事情,然後Windows窗體(它不是從問題明確),你可以選擇System.Timers.Timer,但這一個運行在其他線程,因此,如果您打算採取行動的一些UI元素其Elapsed事件,你必須通過「調用」訪問來管理它。
通過使用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();
如果你有一個,你可以從工具箱中將一個計時器控件拖到你的表單上,它爲你完成上述所有工作。 –
@RobSedgwick是的,我同意你的意見。我們可以通過工具箱添加定時器控制。但我共享的方法是通過運行時添加計時器。 –
參考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));
}
-1 OP提到了一個控制檯應用程序 - 沒有理由將Windows服務類帶入這個環境。特別是在解決問題時,您使用的是與接受的答案相同的Timer類。 – TarkaDaal
這顯示在服務中,但適用於任何代碼。不要提@TarkaDaal。控制檯沒有在這篇文章中提到。只在可能的情況下重複。 –
另一大問題被標記爲重複而不指向解釋這口井 – pixel