zoukankan      html  css  js  c++  java
  • 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();
            }
        }
  • 相关阅读:
    SqlServer2005自动备份
    在Win7下运行使用BDE的程序
    Hibernate连接SqlServer时的小问题
    使用Delphi在SqlServer中对日期的设置
    Flex中连接J2ee的一个小问题
    np使用创建图像 霍夫圆检测 video操作,显示canny边缘
    Web.config的配置
    SQL 进制间如何转换
    jQuery 设置和获取HTML,文本和值
    通过LINQ to XML生成 XML
  • 原文地址:https://www.cnblogs.com/08shiyan/p/4323196.html
Copyright © 2011-2022 走看看