天天看点

适用于WinForm的一个定时器类

尽管.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,如需转载请自行联系原作者

继续阅读