1. 现在有更方便的实现方式:
  1. static void Main(string[] args)
  2. {
  3.  
  4. string input = " ";
  5.  
  6. Task.Factory.StartNew(() => { input = Console.ReadLine(); }).Wait(10 * 1000);
  7.  
  8. Console.WriteLine(input);
  9. }

  

  1. 以下是原来的实现方式:
  1. /// <summary>
  2. /// 控制函数执行时间,超时返回null不继续执行
  3. /// 调用方法
  4. /// FuncTimeout.EventNeedRun action = delegate(object[] param)
  5. /// {
  6. /// //调用自定义函数
  7. /// return Test(param[0].ToString(), param[1].ToString(), (DateTime)param[2]);
  8. /// };
  9. /// FuncTimeout ft = new FuncTimeout(action, 2000);
  10. /// var result = ft.doAction("1", "2", DateTime.Now);
  11. /// </summary>
  12. public class FuncTimeout
  13. {
  14. /// <summary>
  15. /// 信号量
  16. /// </summary>
  17. public ManualResetEvent manu = new ManualResetEvent(false);
  18. /// <summary>
  19. /// 是否接受到信号
  20. /// </summary>
  21. public bool isGetSignal;
  22. /// <summary>
  23. /// 设置超时时间
  24. /// </summary>
  25. public int timeout;
  26. /// <summary>
  27. /// 定义一个委托 ,输入参数可选,输出object
  28. /// </summary>
  29. public delegate object EventNeedRun(params object[] param);
  30. /// <summary>
  31. /// 要调用的方法的一个委托
  32. /// </summary>
  33. private EventNeedRun FunctionNeedRun;
  34.  
  35. /// <summary>
  36. /// 构造函数,传入超时的时间以及运行的方法
  37. /// </summary>
  38. /// <param name="_action">运行的方法 </param>
  39. /// <param name="_timeout">超时的时间</param>
  40. public FuncTimeout(EventNeedRun _action, int _timeout)
  41. {
  42. FunctionNeedRun = _action;
  43. timeout = _timeout;
  44. }
  45.  
  46. /// <summary>
  47. /// 回调函数
  48. /// </summary>
  49. /// <param name="ar"></param>
  50. public void MyAsyncCallback(IAsyncResult ar)
  51. {
  52. //isGetSignal为false,表示异步方法其实已经超出设置的时间,此时不再需要执行回调方法。
  53. if (isGetSignal == false)
  54. {
  55. //放弃执行回调函数;
  56. Thread.CurrentThread.Abort();
  57. }
  58. }
  59.  
  60. /// <summary>
  61. /// 调用函数
  62. /// </summary>
  63. /// <param name="input">可选个数的输入参数</param>
  64. /// <returns></returns>
  65. public object doAction(params object[] input)
  66. {
  67. EventNeedRun WhatTodo = CombineActionAndManuset;
  68. //通过BeginInvoke方法,在线程池上异步的执行方法。
  69. var r = WhatTodo.BeginInvoke(input, MyAsyncCallback, null);
  70. //设置阻塞,如果上述的BeginInvoke方法在timeout之前运行完毕,则manu会收到信号。此时isGetSignal为true。
  71. //如果timeout时间内,还未收到信号,即异步方法还未运行完毕,则isGetSignal为false。
  72. isGetSignal = manu.WaitOne(timeout);
  73.  
  74. if (isGetSignal == true)
  75. {
  76. return WhatTodo.EndInvoke(r);
  77. }
  78. else
  79. {
  80. return null;
  81. }
  82. }
  83.  
  84. /// <summary>
  85. /// 把要传进来的方法,和 manu.Set()的方法合并到一个方法体。
  86. /// action方法运行完毕后,设置信号量,以取消阻塞。
  87. /// </summary>
  88. /// <param name="input">输入参数</param>
  89. /// <returns></returns>
  90. public object CombineActionAndManuset(params object[] input)
  91. {
  92. var output = FunctionNeedRun(input);
  93. manu.Set();
  94. return output;
  95. }
  96. }

  

  

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

  1. C# 给某个方法设定执行超时时间 C#如何控制方法的执行时间,超时则强制退出方法执行 C#函数运行超时则终止执行(任意参数类型及参数个数通用版)

    我自己写的 /// <summary> /// 函数运行超时则终止执行(超时则返回true,否则返回false) /// </summary> /// <typepara ...

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

    声明:所有权利保留. 转载必须说明出处:http://blog.csdn.net/cartzhang/article/details/44203651 今天想写个宏定义,发现宏定义里也可以写不定参数, ...

  3. Java学习笔记——Java程序运行超时后退出或进行其他操作的实现

    当程序进入死循环或者由于其他原因无法自行终止的时候,就需要强制退出程序了. 对于开发软件 Eclipse ,在程序执行超时后,可以点击 Terminate 按钮强制退出. 那么,我们可不可以通过程序设 ...

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

    有个document里定义了一个函数func(),同时在document里嵌入了一个iframe,在这个iframe里调用父窗口的方法:parent.func(),本来我以为这个函数的运行环境是在这个 ...

  5. 使用CreateProcess函数运行其他程序

    为了便于控制通过脚本运行的程序,可以使用win32process模块中的CreateProcess()函数创建一个运行相应程序的进程.其函数原型如下.CreateProcess(appName, co ...

  6. js 终止执行的实现方法

    终止JS运行有如下几种可能: 1.终止函数的运行的方式有两种 (1)在函数中使用return,则当遇到return时,函数终止执行,控制权继续向下运行 (2)在函数中使用try-catch异常处理,需 ...

  7. python调用函数设置超时机制

    有时候需要给函数设置超时机制,以防止它卡住我们的程序,这里可以用python的signal模块,signal模块可以实现程序内部的信号处理. # coding:utf8 import time imp ...

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

    运行超时的 是因为在server端运行命令执行脚本,是server给agent下达的指定,但是server端到agent的10050端口没开,所以或一致堵死在那,知道执行超时, 解决:开通server ...

  9. PHP 函数运行的内存

    函数在运行期间占用的内存,在运行结束后会被回收.但是还有问题不明白,函数内部的echo在函数执行结束后还占用内存吗??? //PHP 函数执行完内存就会被收回 function test() { ec ...

随机推荐

  1. Squish License

    https://www.froglogic.com/squish/gui-testing/prices-and-licensing/index.php Prices and Licensing Who ...

  2. 文件共享windows server 2008 服务器

    1.远程连接到windows server2008 E盘右键共享 2.不能创建文件夹 右键E盘→共享→高级共享→权限→全部打勾即可. 3.ok,文件服务器

  3. View Controller 视图管理总结

    View controller是iOS中顶层的视图载体和控制器,它需要对view负责,管理view的生命周期,相关处室话以及交互事件,除此以外还需要为view提供合适的数据,以供view使用. Vie ...

  4. C#获取进程的主窗口句柄的实现方法

    通过调用Win32 API实现. public class User32API { private static Hashtable processWnd = null; public delegat ...

  5. Linux下redis安装与使用

         redis官网地址:http://www.redis.io/      最新版本:2.8.3      在Linux下安装Redis非常简单,具体步骤如下(官网有说明):      1.下载 ...

  6. oracle内置sql函数(转)

    转自:http://www.cnblogs.com/yening10000/archive/2009/07/02/1515284.html F.1字符函数——返回字符值 这些函数全都接收的是字符族类型 ...

  7. 单例模式——Singleton

    模式分类: 从目的来看: 1.创建型(Creational)模式:负责对象创建. 2.结构型(Structural)模式:处理类于对象间的组合. 3.行为型(Behavioral)模式:类与对象交互中 ...

  8. C++ 中的virtual关键词

    C++ 中的virtual关键词 动态绑定 所谓动态绑定,我的理解就是一个函数在调用之前无法得知参数的具体类型(基类还是派生类).C++ Primer上描述了两种动态绑定的情况: 要触发动态绑定,必须 ...

  9. Java 多线程-上课总结

    Java 多线程 一.操作系统中线程和进程的概念 现在的操作系统是多任务操作系统.多线程是实现多任务的一种方式. 进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启 ...

  10. 初识 Asp.Net内置对象之Cookie对象

    Cookie对象 Cookie对象用于保存客户端浏览器请求的服务器页面,也可用于存放非敏感性的用户信息,信息保存的时间可以根据用户的需要经行设置.并非所有的浏览器都支持Cookie,并非数据信息都是以 ...