且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

适用于WinForm的一个定时器类

更新时间:2022-09-16 19:07:53


尽管.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又让我感到非常晦涩难用,所以就造了一个山寨版的定时器:

适用于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 (间歇时间 < 10throw new Exception("间歇时间不得小于10毫秒!");
适用于WinForm的一个定时器类            
this.间歇时间 = 间歇时间;
适用于WinForm的一个定时器类        }

适用于WinForm的一个定时器类        
/// <summary>
适用于WinForm的一个定时器类        
/// 指示定时时间,以毫秒为单位。
适用于WinForm的一个定时器类        
/// </summary>

适用于WinForm的一个定时器类        public int 定时
适用于WinForm的一个定时器类        
{
适用于WinForm的一个定时器类            
get
适用于WinForm的一个定时器类            
{
适用于WinForm的一个定时器类                
return _定时;
适用于WinForm的一个定时器类            }

适用于WinForm的一个定时器类            
set
适用于WinForm的一个定时器类            
{
适用于WinForm的一个定时器类                _定时 
= value;
适用于WinForm的一个定时器类            }

适用于WinForm的一个定时器类        }

适用于WinForm的一个定时器类        
private int _定时;
适用于WinForm的一个定时器类        
/// <summary>
适用于WinForm的一个定时器类        
/// 指示定时之中的间歇时间,用于检查是否取消执行。
适用于WinForm的一个定时器类        
/// </summary>

适用于WinForm的一个定时器类        public int 间歇时间
适用于WinForm的一个定时器类        
{
适用于WinForm的一个定时器类            
get
适用于WinForm的一个定时器类            
{
适用于WinForm的一个定时器类                
return _间歇时间;
适用于WinForm的一个定时器类            }

适用于WinForm的一个定时器类            
set
适用于WinForm的一个定时器类            
{
适用于WinForm的一个定时器类                _间歇时间 
= value;
适用于WinForm的一个定时器类            }

适用于WinForm的一个定时器类        }

适用于WinForm的一个定时器类        
private int _间歇时间;
适用于WinForm的一个定时器类        
private BackgroundWorker 后台处理进程
适用于WinForm的一个定时器类        
{
适用于WinForm的一个定时器类            
get
适用于WinForm的一个定时器类            
{
适用于WinForm的一个定时器类                
return _后台处理进程;
适用于WinForm的一个定时器类            }

适用于WinForm的一个定时器类            
set
适用于WinForm的一个定时器类            
{
适用于WinForm的一个定时器类                _后台处理进程 
= value;
适用于WinForm的一个定时器类            }

适用于WinForm的一个定时器类        }

适用于WinForm的一个定时器类        
private BackgroundWorker _后台处理进程;
适用于WinForm的一个定时器类        
private object 附件
适用于WinForm的一个定时器类        
{
适用于WinForm的一个定时器类            
get
适用于WinForm的一个定时器类            
{
适用于WinForm的一个定时器类                
return _附件;
适用于WinForm的一个定时器类            }

适用于WinForm的一个定时器类            
set
适用于WinForm的一个定时器类            
{
适用于WinForm的一个定时器类                _附件 
= value;
适用于WinForm的一个定时器类            }

适用于WinForm的一个定时器类        }

适用于WinForm的一个定时器类        
private object _附件;
适用于WinForm的一个定时器类        
/// <summary>
适用于WinForm的一个定时器类        
/// 指示定时器是否处于运行状态
适用于WinForm的一个定时器类        
/// </summary>

适用于WinForm的一个定时器类        public bool 执行中
适用于WinForm的一个定时器类        
{
适用于WinForm的一个定时器类            
get
适用于WinForm的一个定时器类            
{
适用于WinForm的一个定时器类                
return _执行中;
适用于WinForm的一个定时器类            }

适用于WinForm的一个定时器类        }

适用于WinForm的一个定时器类        
private bool _执行中;
适用于WinForm的一个定时器类        
/// <summary>
适用于WinForm的一个定时器类        
/// 启动定时器,如果定时器已经启动,则引发异常。
适用于WinForm的一个定时器类        
/// </summary>
适用于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的一个定时器类        
/// <summary>
适用于WinForm的一个定时器类        
/// 请求中止执行,如果定时器尚未启动,则引发异常。
适用于WinForm的一个定时器类        
/// </summary>

适用于WinForm的一个定时器类        public void 中止(bool 取消触发完毕事件)
适用于WinForm的一个定时器类        
{
适用于WinForm的一个定时器类            
if (!执行中) throw new Exception("定时器尚未启动!");
适用于WinForm的一个定时器类            
this.取消触发完毕事件 = 取消触发完毕事件;
适用于WinForm的一个定时器类            后台处理进程.CancelAsync();
适用于WinForm的一个定时器类        }

适用于WinForm的一个定时器类        
/// <summary>
适用于WinForm的一个定时器类        
/// 达到定时事件代理
适用于WinForm的一个定时器类        
/// </summary>

适用于WinForm的一个定时器类        public delegate void 执行完毕代理(定时器 sender, object 附件, bool 是否为用户取消);
适用于WinForm的一个定时器类        
private bool 取消触发完毕事件
适用于WinForm的一个定时器类        
{
适用于WinForm的一个定时器类            
get
适用于WinForm的一个定时器类            
{
适用于WinForm的一个定时器类                
return _取消触发完毕事件;
适用于WinForm的一个定时器类            }

适用于WinForm的一个定时器类            
set
适用于WinForm的一个定时器类            
{
适用于WinForm的一个定时器类                _取消触发完毕事件 
= value;
适用于WinForm的一个定时器类            }

适用于WinForm的一个定时器类        }

适用于WinForm的一个定时器类        
private bool _取消触发完毕事件;
适用于WinForm的一个定时器类        
/// <summary>
适用于WinForm的一个定时器类        
/// 达到定时事件
适用于WinForm的一个定时器类        
/// </summary>

适用于WinForm的一个定时器类        public event 执行完毕代理 执行完毕事件;
适用于WinForm的一个定时器类
适用于WinForm的一个定时器类        
void b_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
适用于WinForm的一个定时器类        
{
适用于WinForm的一个定时器类            
if (e.Error != nullthrow 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,如需转载请自行联系原作者