實現效果
- 本輔助類主要是用來方便實現定時器輔助類,可指定運行間隔、延遲啓動時間等操作。功能和另外一個定時器輔助類Timer差不多。
- 定時器操作,都通過對象鎖以及在運行處理事件的時候,動態改變間隔事件爲無限等待,處理完成後修改爲間隔時間的方式,實現對定時器的正常、安全執行,不會發生運行一半又跳到下一個的處理過程中。
- .NET提供了3種定時器實現,他們的特點如下所示。TimerHelper是基於Threading.Timer的定時器實現。
名稱 | 命名空間 | 描述 |
---|---|---|
Server Timers | System.Timers.Timer | 基於服務器的計時器,位於"工具箱"的“組件”選項卡上 |
Thread Timers | System.Threading.Timer | 在編程時使用的線程計時器 |
Windows Timers | System.Windows.Forms.Timer | 基於 Windows 的標準計時器,"工具箱"的"Windows 窗體"選項卡上; |
實現步驟
在代碼引用相關的代碼實現動態調用。
實現代碼
/// <summary>
/// 定時器執行操作的函數原型
/// </summary>
public delegate void TimerExecution();
/// <summary>
/// 定時器執行時調用的操作
/// </summary>
public event TimerExecution Execute;
/// <summary>
/// 創建一個指定時間間隔的定時器,並在指定的延遲後開始啓動。(默認間隔爲100毫秒)
/// </summary>
public TimerHelper()
/// <summary>
/// 創建一個指定時間間隔的定時器,並在指定的延遲後開始啓動。
/// </summary>
public TimerHelper(long interval, int startDelay)
/// <summary>
/// 創建一個指定時間間隔的定時器
/// </summary>
public TimerHelper(long interval, bool start)
/// <summary>
/// 啓動定時器並指定延遲時間(毫秒)
/// </summary>
public void Start(int delayBeforeStart)
/// <summary>
/// 立即啓動定時器
/// </summary>
public void Start()
/// <summary>
/// 暫停定時器
/// </summary>
public void Pause()
/// <summary>
/// 停止定時器
/// </summary>
public void Stop()
/// <summary>
/// 定時器的處理時間
/// </summary>
public void Tick(object obj)
/// <summary>
/// 定時器的狀態
/// </summary>
public TimerState State
/// <summary>
/// 獲取或設置定時器的運行間隔
/// </summary>
public long Interval
- 輔助類TimerHelper的使用例子代碼如下所示:
public FrmNewForm()
{
InitializeComponent();
if (!this.DesignMode)
{
//使用定時器,定時刷新窗體的數據,並提示客戶更新情況
int interval = Portal.gc.GetRefreshSecond();//獲取定時間隔時間
TimerHelper timer = new TimerHelper(interval, true);
timer.Execute += new TimerHelper.TimerExecution(timer_Execute);
}
}
//通過Invoke來實現跨線程間的調用
void timer_Execute()
{
if (!this.InvokeRequired)
return;
this.Invoke(new MethodInvoker(delegate()
{
NotifyNewHouse();
}));
}
附上源碼
/// <summary>
/// 定時器輔助類,可指定運行間隔、延遲啓動時間等操作。
/// </summary>
[Serializable]
public class TimerHelper : System.ComponentModel.Component
{
private System.Threading.Timer timer;
private long timerInterval;
private TimerState timerState;
/// <summary>
/// 定時器執行操作的函數原型
/// </summary>
public delegate void TimerExecution();
/// <summary>
/// 定時器執行時調用的操作
/// </summary>
public event TimerExecution Execute;
/// <summary>
/// 創建一個指定時間間隔的定時器,並在指定的延遲後開始啓動。(默認間隔爲100毫秒)
/// </summary>
public TimerHelper()
{
timerInterval = 100;
timerState = TimerState.Stopped;
timer = new System.Threading.Timer(new TimerCallback(Tick), null, Timeout.Infinite, timerInterval);
}
/// <summary>
/// 創建一個指定時間間隔的定時器,並在指定的延遲後開始啓動。
/// </summary>
/// <param name="interval">定時器執行操作的間隔時間(毫秒)</param>
/// <param name="startDelay">指定的延遲時間(毫秒)</param>
public TimerHelper(long interval, int startDelay)
{
timerInterval = interval;
timerState = (startDelay == Timeout.Infinite) ? TimerState.Stopped : TimerState.Running;
timer = new System.Threading.Timer(new TimerCallback(Tick), null, startDelay, interval);
}
/// <summary>
/// 創建一個指定時間間隔的定時器
/// </summary>
/// <param name="interval">定時器執行操作的間隔時間(毫秒)</param>
/// <param name="start">是否啓動</param>
public TimerHelper(long interval, bool start)
{
timerInterval = interval;
timerState = (!start) ? TimerState.Stopped : TimerState.Running;
timer = new System.Threading.Timer(new TimerCallback(Tick), null, 0, interval);
}
/// <summary>
/// 啓動定時器並指定延遲時間(毫秒)
/// </summary>
/// <param name="delayBeforeStart">指定延遲時間(毫秒)</param>
public void Start(int delayBeforeStart)
{
timerState = TimerState.Running;
timer.Change(delayBeforeStart, timerInterval);
}
/// <summary>
/// 立即啓動定時器
/// </summary>
public void Start()
{
timerState = TimerState.Running;
timer.Change(0, timerInterval);
}
/// <summary>
/// 暫停定時器
/// 注意:運行中的線程不會被停止
/// </summary>
public void Pause()
{
timerState = TimerState.Paused;
timer.Change(Timeout.Infinite, timerInterval);
}
/// <summary>
/// 停止定時器
/// 注意:運行中的線程不會被停止
/// </summary>
public void Stop()
{
timerState = TimerState.Stopped;
timer.Change(Timeout.Infinite, timerInterval);
}
/// <summary>
/// 定時器的處理時間
/// </summary>
/// <param name="obj"></param>
public void Tick(object obj)
{
if (timerState == TimerState.Running && Execute != null)
{
lock (this)
{
Execute();
}
}
}
/// <summary>
/// 定時器的狀態
/// </summary>
public TimerState State
{
get
{
return timerState;
}
}
/// <summary>
/// 獲取或設置定時器的運行間隔
/// </summary>
public long Interval
{
get
{
return timerInterval;
}
set
{
timer.Change(((timerState == TimerState.Running) ? value : Timeout.Infinite), value);
}
}
}
/// <summary>
/// 定時器狀態
/// </summary>
public enum TimerState
{
/// <summary>
/// 停止
/// </summary>
Stopped,
/// <summary>
/// 運行中
/// </summary>
Running,
/// <summary>
/// 暫停
/// </summary>
Paused
}