Timer定時(shí)器的設計方法
在系統開(kāi)發(fā)過(guò)程中經(jīng)常用到定時(shí)器進(jìn)行定時(shí)處理,比如比較常見(jiàn)的郵件群發(fā)、實(shí)時(shí)更新論壇的在線(xiàn)人數、文章數、點(diǎn)擊率等。 很多情況下,我們不能對某一狀態(tài)或者某一行為進(jìn)行實(shí)時(shí)監控,所以就希望系統能夠實(shí)現這一功能。通過(guò)多線(xiàn)程技術(shù)可以使得定時(shí)器的性能更高。
本文引用地址:http://dyxdggzs.com/article/201809/388353.htm盡管定時(shí)器能夠自動(dòng)處理或者一些批處理操作,但是定時(shí)器也給系統帶來(lái)一定的安全隱患,特別是當定時(shí)進(jìn)行的操作出現bug時(shí),如果沒(méi)有對Exception做出及時(shí)的處理,系統資源將會(huì )大大的浪費,嚴重的情況下,可能導致系統崩潰。因此,對于定時(shí)器的使用一定要慎重,至少要保證定時(shí)處理的行為出現異常的可能性很小,并在出現Exception的情況下及時(shí)處理。
System.Threading.Timer 是一個(gè)非常常用的定時(shí)器類(lèi),是一個(gè)使用回調方法的計時(shí)器,而且由線(xiàn)程池線(xiàn)程服務(wù),簡(jiǎn)單且對資源要求不高。
public Timer (
TimerCallback callback,
Object state,
TimeSpan dueTime,
TimeSpan period
)
參數
callback
一個(gè) TimerCallback 委托,表示要執行的方法。
state
一個(gè)包含回調方法要使用的信息的對象,或者為 空引用(在 Visual Basic 中為 Nothing)。
dueTime
TimeSpan,表示在 callback 參數調用它的方法之前延遲的時(shí)間量。指定 -1 毫秒以防止啟動(dòng)計時(shí)器。指定零 (0) 以立即啟動(dòng)計時(shí)器。
period
在調用 callback 所引用的方法之間的時(shí)間間隔。指定 -1 毫秒可以禁用定期終止。
方法、原理
使用 TimerCallback 委托指定希望 Timer 執行的方法。計時(shí)器委托在構造計時(shí)器時(shí)指定,并且不能更改。此方法不在創(chuàng )建計時(shí)器的線(xiàn)程上執行,而是在系統提供的 ThreadPool 線(xiàn)程上執行。
創(chuàng )建計時(shí)器時(shí),可以指定在第一次執行方法之前等待的時(shí)間量(截止時(shí)間)以及此后的執行期間等待的時(shí)間量(時(shí)間周期)??梢允褂?Change 方法更改這些值或禁用計時(shí)器。
當不再需要計時(shí)器時(shí),請使用 Dispose 方法釋放計時(shí)器持有的資源。如果希望在計時(shí)器被釋放時(shí)接收到信號,請使用接受 WaitHandle 的 Dispose(WaitHandle) 方法重載。計時(shí)器已被釋放后,WaitHandle 便終止。
由計時(shí)器執行的回調方法應該是可重入的,因為它是在 ThreadPool 線(xiàn)程上調用的。
備注:
在超過(guò) dueTime 以后及此后每隔 period 時(shí)間間隔,都會(huì )調用一次 callback 參數所指定的委托。
如果 dueTime 為零 (0),則立即調用 callback。如果 dueTime 是 -1 毫秒,則不會(huì )調用 callback;計時(shí)器將被禁用,但通過(guò)調用 Change 方法可以重新啟用計時(shí)器。
如果 period 為零 (0) 或 -1 毫秒,而且 dueTime 為正,則只會(huì )調用一次 callback;計時(shí)器的定期行為將被禁用,但通過(guò)使用 Change 方法可以重新啟用該行為。
最簡(jiǎn)單的定時(shí)器
using System;
using System.Threading;
public class TestTimer
{
/**////
/// 定時(shí)器
///
private Timer iTimer;
/**////
/// constructor
///
public TestTimer()
{
iTimer = new System.Threading.Timer(new TimerCallback(Doing));
iTimer.Change(TimeSpan.FromMinutes(5), TimeSpan.FromMinutes(5));
}
/**////
///
///
///
public void Doing(object nObject)
{
//do something
}
}
一個(gè)比較完整的計時(shí)器:
下面是我設計的一個(gè)簡(jiǎn)單實(shí)例。在一個(gè)問(wèn)卷調查系統中,每一張問(wèn)卷都有其終止日期,當到達了終止日期時(shí),需要系統自動(dòng)將其關(guān)閉。這就需要定時(shí)器對問(wèn)卷的狀態(tài)和終止日期進(jìn)行實(shí)時(shí)監控,及時(shí)關(guān)閉。這里采用了一個(gè)簡(jiǎn)單的單件模式來(lái)操作、控制定時(shí)器。 這里主要的操作包括定時(shí)器開(kāi)始、終止、執行一次。
PaperManager管理類(lèi)
/**////
/// 管理類(lèi)
///
public class PaperManager
{
/**////
/// 定時(shí)器
///
private Timer iTimer;
/**////
/// 啟動(dòng)時(shí)間
///
private TimeSpan dueTime;
/**////
/// 方法調用間隔
///
private TimeSpan period;
評論