C# 超时工具类 第二版

附源码,没有附测试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();
        }
    }
复制代码

 

posted @   把爱延续  阅读(1067)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
点击右上角即可分享
微信分享提示