日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

适用于WinForm的一个定时器类

發布時間:2025/3/19 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 适用于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的一个定时器类的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。