C#函数运行超时则终止执行(任意参数类型及参数个数通用版)

    /// <summary>
    /// 控制函数执行时间,超时返回null不继续执行
    /// 调用方法
    /// FuncTimeout.EventNeedRun action = delegate(object[] param)
    /// {
    ///     //调用自定义函数
    ///     return Test(param[0].ToString(), param[1].ToString(), (DateTime)param[2]);
    /// };
    /// FuncTimeout ft = new FuncTimeout(action, 2000);
    /// var result = ft.doAction("1", "2", DateTime.Now);
    /// </summary>
    public class FuncTimeout
    {
        /// <summary>
        /// 信号量
        /// </summary>
        public ManualResetEvent manu = new ManualResetEvent(false);
        /// <summary>
        /// 是否接受到信号
        /// </summary>
        public bool isGetSignal;
        /// <summary>
        /// 设置超时时间
        /// </summary>
        public int timeout;
        /// <summary>
        /// 定义一个委托 ,输入参数可选,输出object
        /// </summary>
        public delegate object EventNeedRun(params object[] param);
        /// <summary>
        /// 要调用的方法的一个委托
        /// </summary>
        private EventNeedRun FunctionNeedRun;

        /// <summary>
        /// 构造函数,传入超时的时间以及运行的方法
        /// </summary>
        /// <param name="_action">运行的方法 </param>
        /// <param name="_timeout">超时的时间</param>
        public FuncTimeout(EventNeedRun _action, int _timeout)
        {
            FunctionNeedRun = _action;
            timeout = _timeout;
        }

        /// <summary>
        /// 回调函数
        /// </summary>
        /// <param name="ar"></param>
        public void MyAsyncCallback(IAsyncResult ar)
        {
            //isGetSignal为false,表示异步方法其实已经超出设置的时间,此时不再需要执行回调方法。
            if (isGetSignal == false)
            {
                //放弃执行回调函数;
                Thread.CurrentThread.Abort();
            }
        }

        /// <summary>
        /// 调用函数
        /// </summary>
        /// <param name="input">可选个数的输入参数</param>
        /// <returns></returns>
        public object doAction(params object[] input)
        {
            EventNeedRun WhatTodo = CombineActionAndManuset;
            //通过BeginInvoke方法,在线程池上异步的执行方法。
            var r = WhatTodo.BeginInvoke(input, MyAsyncCallback, null);
            //设置阻塞,如果上述的BeginInvoke方法在timeout之前运行完毕,则manu会收到信号。此时isGetSignal为true。
            //如果timeout时间内,还未收到信号,即异步方法还未运行完毕,则isGetSignal为false。
            isGetSignal = manu.WaitOne(timeout);

            if (isGetSignal == true)
            {
                return WhatTodo.EndInvoke(r);
            }
            else
            {
                return null;
            }
        }

        /// <summary>
        /// 把要传进来的方法,和 manu.Set()的方法合并到一个方法体。
        /// action方法运行完毕后,设置信号量,以取消阻塞。
        /// </summary>
        /// <param name="input">输入参数</param>
        /// <returns></returns>
        public object CombineActionAndManuset(params object[] input)
        {
            var output = FunctionNeedRun(input);
            manu.Set();
            return output;
        }
    }

  

时间: 2024-10-06 21:03:24

C#函数运行超时则终止执行(任意参数类型及参数个数通用版)的相关文章

C# 给某个方法设定执行超时时间 C#函数运行超时则终止执行(任意参数类型及参数个数通用版)

在某些情况下(例如通过网络访问数据),常常不希望程序卡住而占用太多时间以至于造成界面假死. 在这时.我们可以通过Thread.Thread + Invoke(UI)或者是 delegate.BeginInvoke 来避免界面假死, 但是这样做时,某些代码或者是某个方法的执行超时的时间还是无法操控的.那么我们又是否有一种比较通用的方法.来设定某一个方法的执行超时的时间,让该其一旦超过指定时间则跳出指定方法.进而继续向下执行呢? 答案当然是肯定的. delegate.BeginInvoke可以实现代

C++省略号类型和参数个数不确定函数参数范例

声明:所有权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/44203651 今天想写个宏定义,发现宏定义里也可以写不定参数,但是我的宏最终没有用. 因为我觉得写完,这个不定参数给我带来的麻烦,比好处好想多. 因此我就定义了两个宏,用一个宏定义另一个. 把今天这个c++的类型不确定和参数个数不确定的用法先记下来.以备后用啊. 直接代码: #include<cstdarg> // 必备头文件 #include<ios

在iframe里调用parent.func()引出的js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里

有个document里定义了一个函数func(),同时在document里嵌入了一个iframe,在这个iframe里调用父窗口的方法:parent.func(),本来我以为这个函数的运行环境是在这个iframe自己里面,测试发现虽然是在iframe里面调用的这个函数,但是运行环境依然是在父窗口里. 所以也验证了JS权威指南中的:js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里. 又比如 var a=1; function f1(){console.log(a);}; functi

js 终止执行的实现方法

终止JS运行有如下几种可能: 1.终止函数的运行的方式有两种 (1)在函数中使用return,则当遇到return时,函数终止执行,控制权继续向下运行 (2)在函数中使用try-catch异常处理,需要结束时,使用throw抛出异常 function getRectArea(width, height) { if (isNaN(width) || isNaN(height)) { throw "Parameter is not a number!"; } } try { getRect

深入解析父子线程(父子线程相互独立,子线程使用自己的栈空间,进程要等到所有线程终止运行之后才终止运行)

说起多线程,我们可以说起一大堆和它相关的有趣话题来,比如什么子孙线程关系,父子线程关系,线程同步异步之类的研究话题来,而我今天所说的,是关于父子线程的一些有趣现象. 首先提出一个问题,“在多线程的应用程序中,当父线程结束之后,子线程会不会退出呢?”,本文将围绕这个问题,深入分析windows中父子线程的生命周期及他们之间的关系. 我们知道,不管你使用的是何种编程语言,但当我们在windows下编程,且使用了平台相关性的库的时候,不管我们使用什么函数来创建线程,最终的结果是,我们的代码中都会调用C

python练习题之一个记录函数运行的装饰器

1.写一个装饰器,查看函数执行的时间 import datetimeimport timedef jishi(fun): def warper(): start_time = datetime.datetime.now() fun() end_time = datetime.datetime.now() haoshi = (end_time-start_time).total_seconds() print("函数运行耗时{}".format(haoshi)) return warpe

python调用函数设置超时机制

有时候需要给函数设置超时机制,以防止它卡住我们的程序,这里可以用python的signal模块,signal模块可以实现程序内部的信号处理. # coding:utf8 import time import signal # 自定义超时异常 class TimeoutError(Exception): def __init__(self, msg): super(TimeoutError, self).__init__() self.msg = msg def time_out(interval

JMX脚本再某些机器上报错,有的运行超时

运行超时的 是因为在server端运行命令执行脚本,是server给agent下达的指定,但是server端到agent的10050端口没开,所以或一致堵死在那,知道执行超时, 解决:开通server端到agent的10050端口. 运行报错,提示错误的语法 正常jmx脚本跑在py2.6的机器上,报错的那两台机器是2.4的版本 可能是因为解释器版本的不同导致的语法解析错误,对于2.4的版本重新更改脚本. 原文地址:https://www.cnblogs.com/0916m/p/11688912.

【蓝桥杯】历届试题 小朋友排队(运行超时)

  历届试题 小朋友排队   时间限制:1.0s   内存限制:256.0MB 问题描述 n 个小朋友站成一排.现在要把他们按身高从低到高的顺序排列,但是每次只能交换位置相邻的两个小朋友. 每个小朋友都有一个不高兴的程度.开始的时候,所有小朋友的不高兴程度都是0. 如果某个小朋友第一次被要求交换,则他的不高兴程度增加1,如果第二次要求他交换,则他的不高兴程度增加2(即不高兴程度为3),依次类推.当要求某个小朋友第k次交换时,他的不高兴程度增加k. 请问,要让所有小朋友按从低到高排队,他们的不高兴