线程运行超时处理类

线程运行超时处理类

    public class TimeoutChecker
    {
        #region /*private member*/

        long _timeout; //超时时间
        System.Action<Delegate> _proc;//会超时的代码
        System.Action<Delegate> _procHandle;//处理超时
        System.Action<Delegate> _timeoutHandle;//超时后处理事件
        System.Threading.ManualResetEvent _event = new System.Threading.ManualResetEvent(false);

        #endregion

        #region /*constructor method*/

        /// <summary>
        /// 构选方法
        /// </summary>
        /// <param name="proc">会超时的代码</param>
        /// <param name="timeoutHandle">超时后处理事件</param>
        public TimeoutChecker(System.Action<Delegate> proc, System.Action<Delegate> timeoutHandle)
        {
            this._proc = proc;
            this._timeoutHandle = timeoutHandle;
            this._procHandle = delegate
            {
                //计算代码执行的时间
                System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
                sw.Start();
                if (this._proc != null)
                    this._proc(null);
                sw.Stop();
                //如果执行时间小于超时时间则通知用户线程
                if (sw.ElapsedMilliseconds < this._timeout && this._event != null)
                {
                    this._event.Set();
                }
            };
        }

        #endregion

        #region /*public method*/

        /// <summary>
        /// 等待执行
        /// </summary>
        /// <param name="timeout">等待时间毫秒</param>
        /// <returns></returns>
        public bool Wait(long timeout)
        {
            this._timeout = timeout;
            //异步执行
            this._procHandle.BeginInvoke(null, null, null);
            //如果在规定时间内没等到通知则为 false
            bool flag = this._event.WaitOne((int)timeout, false);
            if (!flag)
            {
                //触发超时时间
                if (this._timeoutHandle != null)
                    this._timeoutHandle(null);
            }
            this.Dispose();

            return flag;
        }

        #endregion

        #region private method

        /// <summary>
        /// 释放资源
        /// </summary>
        private void Dispose()
        {
            if (this._event != null)
                this._event.Close();
            this._event = null;
            this._proc = null;
            this._procHandle = null;
            this._timeoutHandle = null;
        }

        #endregion
    }

调用

 

 TimeoutChecker timeout = new TimeoutChecker(
                    delegate
                    {
                        
                        try
                        {
                            //把耗时的处理加到这里
                           
                        }
                        catch (Exception he)//异常处理
                        {
                           
                        }
                    },
                    delegate//超时处理
                    {
                     
                    });

                // 按毫秒等待
                // 执行成功的处理,且未超时
                if (timeout.Wait(10000))
                {
                    Console.WriteLine("WaitTimes: {0}", DateTime.Now.ToString());
                }

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/110454.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号