适用于WinForm的一个定时器类
盡管.Net已經提供了3個Timer,我仍然要自己利用BackgroundWorker組件封裝這么一個定時器來使用。
主要原因是System.Windows.Forms以及System.Threading.Timer的Timer同時運行多個的時候會產生令人發狂的錯亂,停止其中一個Timer的時候,可能會引發其他Timer注冊的事件,對此類靈異事件,查遍互聯網后只在MSDN發現了這么一段說明:
由于所有?Timer?組件都在主應用程序線程上操作,所以在 Windows 窗體應用程序中的任意?Timer?上調用 Stop 都可以導致來自應用程序中其他?Timer?組件的消息被立即處理。如果有兩個?Timer?組件,分別設置為 700 毫秒和 500 毫秒,并且從第一個?Timer?調用?Stop,則應用程序可能首先接收第二個組件的事件回調。如果這證明有問題,請考慮轉為使用?System.Threading?命名空間中的?Timer?類。
而System.Threading.Timer的Timer又讓我感到非常晦澀難用,所以就造了一個山寨版的定時器:
????public?class?定時器????{
????????///?<summary>
????????///?創建一個定時器對象。
????????///?</summary>
????????///?<param?name="定時">指示定時時間,以毫秒為單位。</param>
????????///?<param?name="間歇時間">指示定時之中的間歇時間,用于檢查是否取消執行。</param>
????????public?定時器(int?定時,?int?間歇時間)
????????{
????????????this.定時?=?定時;
????????????if?(間歇時間?<?10)?throw?new?Exception("間歇時間不得小于10毫秒!");
????????????this.間歇時間?=?間歇時間;
????????}
????????///?<summary>
????????///?指示定時時間,以毫秒為單位。
????????///?</summary>
????????public?int?定時
????????{
????????????get
????????????{
????????????????return?_定時;
????????????}
????????????set
????????????{
????????????????_定時?=?value;
????????????}
????????}
????????private?int?_定時;
????????///?<summary>
????????///?指示定時之中的間歇時間,用于檢查是否取消執行。
????????///?</summary>
????????public?int?間歇時間
????????{
????????????get
????????????{
????????????????return?_間歇時間;
????????????}
????????????set
????????????{
????????????????_間歇時間?=?value;
????????????}
????????}
????????private?int?_間歇時間;
????????private?BackgroundWorker?后臺處理進程
????????{
????????????get
????????????{
????????????????return?_后臺處理進程;
????????????}
????????????set
????????????{
????????????????_后臺處理進程?=?value;
????????????}
????????}
????????private?BackgroundWorker?_后臺處理進程;
????????private?object?附件
????????{
????????????get
????????????{
????????????????return?_附件;
????????????}
????????????set
????????????{
????????????????_附件?=?value;
????????????}
????????}
????????private?object?_附件;
????????///?<summary>
????????///?指示定時器是否處于運行狀態
????????///?</summary>
????????public?bool?執行中
????????{
????????????get
????????????{
????????????????return?_執行中;
????????????}
????????}
????????private?bool?_執行中;
????????///?<summary>
????????///?啟動定時器,如果定時器已經啟動,則引發異常。
????????///?</summary>
????????///?<param?name="附件">在定時完成時可能被使用到的傳遞對象。</param>
????????public?void?執行(object?附件)
????????{
????????????if?(執行中)?throw?new?Exception("定時器已啟動!");
????????????_執行中?=?true;
????????????this.附件?=?附件;
????????????后臺處理進程?=?new?BackgroundWorker();
????????????后臺處理進程.WorkerSupportsCancellation?=?true;
????????????后臺處理進程.DoWork?+=?new?DoWorkEventHandler(b_DoWork);
????????????后臺處理進程.RunWorkerCompleted?+=?new?RunWorkerCompletedEventHandler(b_RunWorkerCompleted);
????????????后臺處理進程.RunWorkerAsync(this);
????????}
????????///?<summary>
????????///?請求中止執行,如果定時器尚未啟動,則引發異常。
????????///?</summary>
????????public?void?中止(bool?取消觸發完畢事件)
????????{
????????????if?(!執行中)?throw?new?Exception("定時器尚未啟動!");
????????????this.取消觸發完畢事件?=?取消觸發完畢事件;
????????????后臺處理進程.CancelAsync();
????????}
????????///?<summary>
????????///?達到定時事件代理
????????///?</summary>
????????public?delegate?void?執行完畢代理(定時器?sender,?object?附件,?bool?是否為用戶取消);
????????private?bool?取消觸發完畢事件
????????{
????????????get
????????????{
????????????????return?_取消觸發完畢事件;
????????????}
????????????set
????????????{
????????????????_取消觸發完畢事件?=?value;
????????????}
????????}
????????private?bool?_取消觸發完畢事件;
????????///?<summary>
????????///?達到定時事件
????????///?</summary>
????????public?event?執行完畢代理?執行完畢事件;
????????void?b_RunWorkerCompleted(object?sender,?RunWorkerCompletedEventArgs?e)
????????{
????????????if?(e.Error?!=?null)?throw?e.Error;
????????????if?(!取消觸發完畢事件&&執行完畢事件?!=?null)
????????????{
????????????????var?o?=?e.Result?as?定時器;
????????????????執行完畢事件(o,?o.附件,?e.Cancelled);
????????????}
????????????_執行中?=?false;
????????????后臺處理進程.Dispose();
????????}
????????void?b_DoWork(object?sender,?DoWorkEventArgs?e)
????????{
????????????var?o?=?e.Argument?as?定時器;
????????????e.Result?=?o;
????????????int?x?=?0;
????????????while?(true)
????????????{
????????????????if?(x?>=?o.定時?||?(sender?as?BackgroundWorker).CancellationPending)?break;
????????????????Thread.Sleep(o.間歇時間);
????????????????x?+=?o.間歇時間;
????????????}
????????}
????}
?
使用起來很簡單,“new”了之后“執行()”就可以了。
使用了WinForm的BackgroundWorker組件,所以不曉得ASP.Net能不能用。
本文轉自斯克迪亞博客園博客,原文鏈接:http://www.cnblogs.com/SkyD/archive/2009/04/12/timer.html,如需轉載請自行聯系原作者
總結
以上是生活随笔為你收集整理的适用于WinForm的一个定时器类的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 菜鸟学Linux 第052篇笔记 htt
- 下一篇: 订单自动生成器的算法研究与实现