线程运行超时处理类

线程运行超时处理类

    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());
                }

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • CentOS6.5

    CentOS6.5

    2022年2月22日
    48
  • Sql Server数据恢复

    Sql Server数据恢复

    2021年8月2日
    59
  • python中的缩进规则_什么叫代码缩进

    python中的缩进规则_什么叫代码缩进引言python对缩进是敏感的,而大多教程对缩进规则,往往就几句话带过,对于没有其他语言基础的初学者,十分不友好,本文就把python常见的缩进问题做了一些整理。一、Python缩进长度及缩进字符常看到一些Python缩进错误的解读,“tab符和空格做为缩进不能混用”、“缩进一定是4个空格”。实际上并没有这些限制,例如图中的示例就可以正常运行。a=1ifa==1:print(a)else:print(1)k=1;whilek<5:

    2022年10月11日
    2
  • NAT配置实验_隧道模型受力及模型实验理解和认识

    NAT配置实验_隧道模型受力及模型实验理解和认识Iodine介绍Iodine,直译过来就是碘。碘元素在元素周期表中序号为53,正好是DNS使用的端口号。该工具用于建立DNS隧道,其分为服务端和客户端两部分(也常称为主控端和被控端),客户端对服务器端发送DNS请求建立连接。这两部分都是用C语言编写,支持EDNS、base32、base64、base128等多种编码规范。DNS隧道常分为中继和直连两种类型,中继是指DNS通过外网DNS服务器转发到服务端,直连是指直接通过服务端IP进行连接。Iodine对这两种类型都有支持。同时,Iodine支持多种DN

    2025年8月1日
    4
  • red入门学习笔记

    red入门学习笔记

    2021年11月3日
    42
  • VMware下载安装教程(vbox虚拟机安装教程)

    全网最详细的VMware虚拟机下载安装教程第一步下载虚拟机1.进入VMware官网,点击左侧导航栏中的下载,选择下拉列表中的产品下载,再点击图中标记的WorkstationPro,如下图所示。2.选择自己需要的版本和操作系统,在这里以Windows系统为例,点击转至下载,如下图所示。-3.点击转至下载后也在此处可以选择版本。选择好版本后点击立即下载。如下图所示。4.注意,需要登录之后才能下载。若无账号可点击注册后登录。如下图所示。二、安装虚拟机1.进入下载路径,双击.

    2022年4月10日
    90

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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