首页 > 学院 > 开发设计 > 正文

C#超时工具类第二版

2019-11-14 16:08:22
字体:
来源:转载
供稿:网友

源码,没有附测试demo

 

之前的工具类:C# 给某个方法设定执行超时时间

 

    /// <summary>    /// 超时工具    /// </summary>    public class TimeoutTools : IDisposable    {        PRivate System.Windows.Forms.Timer timer;        /// <summary>        /// 位置        /// </summary>        public uint Position { get; private set; }        /// <summary>        /// 超时事件        /// </summary>        public event EventHandler TimeoutEvent;        /// <summary>        /// Tick事件        /// </summary>        public event EventHandler TickEvent;        /// <summary>        /// 步长值        /// <para>默认值1</para>        /// </summary>        public uint StepLength { get; set; }        /// <summary>        /// 超时长度        /// <para>默认180</para>        /// </summary>        public uint TimeoutLength { get; set; }        /// <summary>        /// 默认构造函数        /// </summary>        public TimeoutTools(System.ComponentModel.IContainer container)        {            this.StepLength = 1;            this.TimeoutLength = 180;            this.timer = new System.Windows.Forms.Timer(container);            this.timer.Interval = 1000;            this.timer.Enabled = false;            timer.Tick += (sender, e) =>            {                this.Position += this.StepLength;                if (this.Position >= this.TimeoutLength)                {                    this.Reset();                    this.OnTimeOut();                }                else                {                    if (this.TickEvent != null)                    {                        this.TickEvent(this, EventArgs.Empty);                    }                }            };        }        ///<summary>                /// 指定超时时间 执行某个方法                ///</summary>        ///<returns>执行 是否超时</returns>        public static bool DoAction(TimeSpan timeSpan, Action action)        {            if (action == null)                throw new ArgumentNullException("action is null");            bool timeout = true;            try            {                // 异步调用Action                IAsyncResult result = action.BeginInvoke(null, null);                // Wait                if (result.AsyncWaitHandle.WaitOne(timeSpan, false))                {                    timeout = false;                }                if (!timeout)                {                    action.EndInvoke(result);                }            }            catch (Exception)            {                timeout = true;            }            return timeout;        }        /// <summary>        /// 设置计时器参数        /// </summary>        /// <param name="period">毫秒</param>        public void SetInterval(int period)        {            if (period == Timeout.Infinite)            {                this.timer.Enabled = false;                return;            }            this.timer.Interval = period;            this.timer.Enabled = true;        }        /// <summary>        /// 接收到信号        /// </summary>        public void Reset()        {            this.Position = 0;        }        protected void OnTimeOut()        {            if (this.TimeoutEvent != null)            {                this.TimeoutEvent(this, EventArgs.Empty);            }        }        public void Dispose()        {            if (this.timer == null)                return;            this.timer.Enabled = false;            this.timer.Dispose();        }    }

 


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表