C#函数运行超时则终止执行(任意参数类型及参数个数通用版)
- 现在有更方便的实现方式:
- static void Main(string[] args)
- {
- string input = " ";
- Task.Factory.StartNew(() => { input = Console.ReadLine(); }).Wait(10 * 1000);
- Console.WriteLine(input);
- }
- 以下是原来的实现方式:
- /// <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;
- }
- }
C#函数运行超时则终止执行(任意参数类型及参数个数通用版)的更多相关文章
- C# 给某个方法设定执行超时时间 C#如何控制方法的执行时间,超时则强制退出方法执行 C#函数运行超时则终止执行(任意参数类型及参数个数通用版)
我自己写的 /// <summary> /// 函数运行超时则终止执行(超时则返回true,否则返回false) /// </summary> /// <typepara ...
- C++省略号类型和参数个数不确定函数参数范例
声明:所有权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/44203651 今天想写个宏定义,发现宏定义里也可以写不定参数, ...
- Java学习笔记——Java程序运行超时后退出或进行其他操作的实现
当程序进入死循环或者由于其他原因无法自行终止的时候,就需要强制退出程序了. 对于开发软件 Eclipse ,在程序执行超时后,可以点击 Terminate 按钮强制退出. 那么,我们可不可以通过程序设 ...
- 在iframe里调用parent.func()引出的js函数运行在它们被定义的作用域里,而不是它们被执行的作用域里
有个document里定义了一个函数func(),同时在document里嵌入了一个iframe,在这个iframe里调用父窗口的方法:parent.func(),本来我以为这个函数的运行环境是在这个 ...
- 使用CreateProcess函数运行其他程序
为了便于控制通过脚本运行的程序,可以使用win32process模块中的CreateProcess()函数创建一个运行相应程序的进程.其函数原型如下.CreateProcess(appName, co ...
- js 终止执行的实现方法
终止JS运行有如下几种可能: 1.终止函数的运行的方式有两种 (1)在函数中使用return,则当遇到return时,函数终止执行,控制权继续向下运行 (2)在函数中使用try-catch异常处理,需 ...
- python调用函数设置超时机制
有时候需要给函数设置超时机制,以防止它卡住我们的程序,这里可以用python的signal模块,signal模块可以实现程序内部的信号处理. # coding:utf8 import time imp ...
- JMX脚本在某些机器上报错,有的运行超时
运行超时的 是因为在server端运行命令执行脚本,是server给agent下达的指定,但是server端到agent的10050端口没开,所以或一致堵死在那,知道执行超时, 解决:开通server ...
- PHP 函数运行的内存
函数在运行期间占用的内存,在运行结束后会被回收.但是还有问题不明白,函数内部的echo在函数执行结束后还占用内存吗??? //PHP 函数执行完内存就会被收回 function test() { ec ...
随机推荐
- LeetCode33 Search in Rotated Sorted Array
题目: Suppose a sorted array is rotated at some pivot unknown to you beforehand. (i.e., 0 1 2 4 5 6 7 ...
- iOS 10 推送必看(高阶1)
来源:徐不同 链接:http://www.jianshu.com/p/3d602a60ca4f iOS10 推送必看(基础篇) 虽然这篇文章比较长,也不好理解,但是还是建议大家收藏,以后用到的时候,可 ...
- android 布局之滑动探究 scrollTo 和 scrollBy 方法使用说明
涉及到滑动,就涉及到VIEW,大家都知道,Android的UI界面都是由一个一个的View以及View的派生类组成,View作为基类,而常用的布局里面的各种布局就是它派生出来的ViewGroup的子类 ...
- oracle-同义词Synonyms + 用户访问控制(grant 和 revoke)
同义词(Synonyms) 创建同义词: 语法 CREATE [PUBLIC] SYNONYM synonym FOR object; CREATE SYNONYM ...
- 网络流sap算法模版
递归版sap: #include<cstdio> #include<iostream> #include<cstring> #include<algorith ...
- python实现发送邮件功能
'''套接字是为特定的网络协议(例如TCP/IP,ICMP/IP,UDP/IP等),允许程序和接受并进行连接,要在python 中建立具有TCP和流套接字的简单服务器,需要使用socket模块,利用该 ...
- Linux之查看文件大小
1.查看当前文件大小du -sh ./ du [-abcDhHklmsSx] [-L <符号连接>][-X <文件>][--block-size][--exclude=< ...
- 如何调试异步加载的js文件(浏览器调试动态加载js)
描述 1:jQuery->var obj= new $.js_Obj():等异步加载js文件,执行方法. obj.method(): 2:页面估计不变,通过声明不同的js文件,进行页面内容的转换 ...
- Table of Contents - TCP/IP
网络访问层 Ethernet II 网际层 IP IPv4 报文格式 ICMP ICMP 报文分析 ping: 向网络主机发送 ICMP ECHO_REQUEST 包 ARP ARP 过程 arp 命 ...
- [转载]JSON序列化与反序列化
转载:http://www.cnblogs.com/ejiyuan/archive/2010/04/09/1708084.html 方法一:引入System.Web.Script.Serializat ...