• 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();
            }
        }
  • 相关阅读:
    【openCV学习笔记】【2】读取并播放一段视频
    Net WebApi中使用Swagger
    .pfx格式和.Cer格式的区别
    数字证书原理
    ASP.NET发送电子邮件
    WindowsAzure上把WebApp和WebService同时部署在一个WebRole中
    JS原型与原型链终极详解
    三、ASP.NET MVC Controller 控制器(二:IController控制器的创建过程)
    二、ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)
    一、ASP.NET Routing路由(深入解析路由系统架构原理)
  • 原文地址:https://www.cnblogs.com/08shiyan/p/4323196.html
Copyright © 2020-2023  润新知