定時器輔助類TimerHelper,可指定運行間隔、延遲啓動時間等操作

實現效果

  1. 本輔助類主要是用來方便實現定時器輔助類,可指定運行間隔、延遲啓動時間等操作。功能和另外一個定時器輔助類Timer差不多。
  2. 定時器操作,都通過對象鎖以及在運行處理事件的時候,動態改變間隔事件爲無限等待,處理完成後修改爲間隔時間的方式,實現對定時器的正常、安全執行,不會發生運行一半又跳到下一個的處理過程中。
  3. .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
  1. 輔助類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
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章