尽管.Net已经提供了3个Timer,我仍然要自己利用BackgroundWorker组件封装这么一个定时器来使用。
主要原因是System.Windows.Forms以及System.Threading.Timer的Timer同时运行多个的时候会产生令人发狂的错乱,停止其中一个Timer的时候,可能会引发其他Timer注册的事件,对此类灵异事件,查遍互联网后只在MSDN发现了这么一段说明:
而System.Threading.Timer的Timer又让我感到非常晦涩难用,所以就造了一个山寨版的定时器:
适用于WinForm的一个定时器类 public class 定时器
适用于WinForm的一个定时器类 {
适用于WinForm的一个定时器类 /// <summary>
适用于WinForm的一个定时器类 /// 创建一个定时器对象。
适用于WinForm的一个定时器类 /// </summary>
适用于WinForm的一个定时器类 /// <param name="定时">指示定时时间,以毫秒为单位。</param>
适用于WinForm的一个定时器类 /// <param name="间歇时间">指示定时之中的间歇时间,用于检查是否取消执行。</param>
适用于WinForm的一个定时器类 public 定时器(int 定时, int 间歇时间)
适用于WinForm的一个定时器类 {
适用于WinForm的一个定时器类 this.定时 = 定时;
适用于WinForm的一个定时器类 if (间歇时间 < 10) throw new Exception("间歇时间不得小于10毫秒!");
适用于WinForm的一个定时器类 this.间歇时间 = 间歇时间;
适用于WinForm的一个定时器类 }
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 /// 指示定时时间,以毫秒为单位。
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 public int 定时
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 get
适用于WinForm的一个定时器类 {
适用于WinForm的一个定时器类 return _定时;
适用于WinForm的一个定时器类 }
适用于WinForm的一个定时器类 set
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 _定时 = value;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 private int _定时;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 /// 指示定时之中的间歇时间,用于检查是否取消执行。
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 public int 间歇时间
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 return _间歇时间;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 _间歇时间 = value;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 private int _间歇时间;
适用于WinForm的一个定时器类 private BackgroundWorker 后台处理进程
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 return _后台处理进程;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 _后台处理进程 = value;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 private BackgroundWorker _后台处理进程;
适用于WinForm的一个定时器类 private object 附件
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 return _附件;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 _附件 = value;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 private object _附件;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 /// 指示定时器是否处于运行状态
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 public bool 执行中
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 return _执行中;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 private bool _执行中;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 /// 启动定时器,如果定时器已经启动,则引发异常。
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 /// <param name="附件">在定时完成时可能被使用到的传递对象。</param>
适用于WinForm的一个定时器类 public void 执行(object 附件)
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 if (执行中) throw new Exception("定时器已启动!");
适用于WinForm的一个定时器类 _执行中 = true;
适用于WinForm的一个定时器类 this.附件 = 附件;
适用于WinForm的一个定时器类 后台处理进程 = new BackgroundWorker();
适用于WinForm的一个定时器类 后台处理进程.WorkerSupportsCancellation = true;
适用于WinForm的一个定时器类 后台处理进程.DoWork += new DoWorkEventHandler(b_DoWork);
适用于WinForm的一个定时器类 后台处理进程.RunWorkerCompleted += new RunWorkerCompletedEventHandler(b_RunWorkerCompleted);
适用于WinForm的一个定时器类 后台处理进程.RunWorkerAsync(this);
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 /// 请求中止执行,如果定时器尚未启动,则引发异常。
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 public void 中止(bool 取消触发完毕事件)
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 if (!执行中) throw new Exception("定时器尚未启动!");
适用于WinForm的一个定时器类 this.取消触发完毕事件 = 取消触发完毕事件;
适用于WinForm的一个定时器类 后台处理进程.CancelAsync();
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 /// 达到定时事件代理
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 public delegate void 执行完毕代理(定时器 sender, object 附件, bool 是否为用户取消);
适用于WinForm的一个定时器类 private bool 取消触发完毕事件
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 return _取消触发完毕事件;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 _取消触发完毕事件 = value;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 private bool _取消触发完毕事件;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 /// 达到定时事件
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 public event 执行完毕代理 执行完毕事件;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 void b_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 if (e.Error != null) throw e.Error;
适用于WinForm的一个定时器类 if (!取消触发完毕事件&&执行完毕事件 != null)
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 var o = e.Result as 定时器;
适用于WinForm的一个定时器类 执行完毕事件(o, o.附件, e.Cancelled);
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 _执行中 = false;
适用于WinForm的一个定时器类 后台处理进程.Dispose();
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 void b_DoWork(object sender, DoWorkEventArgs e)
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 var o = e.Argument as 定时器;
适用于WinForm的一个定时器类 e.Result = o;
适用于WinForm的一个定时器类 int x = 0;
适用于WinForm的一个定时器类 while (true)
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 if (x >= o.定时 || (sender as BackgroundWorker).CancellationPending) break;
适用于WinForm的一个定时器类 Thread.Sleep(o.间歇时间);
适用于WinForm的一个定时器类 x += o.间歇时间;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类 }
使用起来很简单,“new”了之后“执行()”就可以了。
使用了WinForm的BackgroundWorker组件,所以不晓得ASP.Net能不能用。
本文转自斯克迪亚博客园博客,原文链接:http://www.cnblogs.com/SkyD/archive/2009/04/12/timer.html,如需转载请自行联系原作者