在某些情况下(例如通过网络访问数据),常常不希望程序卡住而占用太多时间以至于造成界面假死。

在这时、我们可以通过Thread、Thread + Invoke(UI)或者是 delegate.BeginInvoke 来避免界面假死,

但是这样做时,某些代码或者是某个方法的执行超时的时间还是无法操控的。
那么我们又是否有一种比较通用的方法、来设定某一个方法的执行超时的时间,让其一旦超过指定时间则跳出指定方法、进而继续向下执行呢?

答案当然是肯定的。

delegate.BeginInvoke可以实现代码代码的异步执行,在这种情况下,只要让程序可以等待一个Timespan,如果在Timespan到达之前方法内的代码还没有执行完毕、说明该方法执行超时了。

那么关键的就是“等待一个Timespan”,而恰好.NET 里提供了一些类和方法来实现该功能。我这里选用的是ManualResetEvent.WaitOne(timespan, false);其返回值代码其是否在特定时间内收到信号,而我们恰好可以利用这个布尔值 外加一个标记变量 来判断一个方法是否执行超时。

相关的实现代码如下:

public delegate void DoHandler();public class Timeout{private ManualResetEvent mTimeoutObject;//标记变量private bool mBoTimeout;public DoHandler Do;public Timeout(){//  初始状态为 停止this.mTimeoutObject = new ManualResetEvent(true);}///<summary>/// 指定超时时间 异步执行某个方法///</summary>///<returns>执行 是否超时</returns>public bool DoWithTimeout(TimeSpan timeSpan){if (this.Do == null){return false;}this.mTimeoutObject.Reset();this.mBoTimeout = true; //标记this.Do.BeginInvoke(DoAsyncCallBack, null);// 等待 信号Setif (!this.mTimeoutObject.WaitOne(timeSpan, false)){this.mBoTimeout = true;}return this.mBoTimeout;}///<summary>/// 异步委托 回调函数///</summary>///<param name="result"></param>private void DoAsyncCallBack(IAsyncResult result){try{this.Do.EndInvoke(result);// 指示方法的执行未超时this.mBoTimeout = false;}catch (Exception ex){Console.WriteLine(ex.Message);this.mBoTimeout = true;}finally{this.mTimeoutObject.Set();}}}

View Code

调用:

private static Stopwatch watch;private static System.Threading.Timer timer;static void Main(string[] args){watch = new Stopwatch();Timeout timeout = new Timeout();timeout.Do = new Program().DoSomething;watch.Start();timer = new System.Threading.Timer(timerCallBack, null, 0, 500);Console.WriteLine("4秒超时开始执行");bool bo = timeout.DoWithTimeout(new TimeSpan(0, 0, 0, 4));Console.WriteLine(string.Format("4秒超时执行结果,是否超时:{0}", bo));Console.WriteLine("***************************************************");timeout = new Timeout();timeout.Do = new Program().DoSomething;Console.WriteLine("6秒超时开始执行");bo = timeout.DoWithTimeout(new TimeSpan(0, 0, 0, 6));Console.WriteLine(string.Format("6秒超时执行结果,是否超时:{0}", bo));timerCallBack(null);watch.Stop();timer.Dispose();Console.ReadLine();}static void timerCallBack(object obj){Console.WriteLine(string.Format("运行时间:{0}秒", watch.Elapsed.TotalSeconds.ToString("F2")));}public void DoSomething(){// 休眠 5秒System.Threading.Thread.Sleep(new TimeSpan(0, 0, 0, 5));}

View Code

地址:http://www.cnblogs.com/08shiyan/archive/2011/07/30/2122183.html

C# 给某个方法设定执行超时时间相关推荐

  1. c#程序设定使用期限_C# 给某个方法设定执行超时时间

    在某些情况下(例如通过网络访问数据),常常不希望程序卡住而占用太多时间以至于造成界面假死. 在这时.我们可以通过Thread.Thread + Invoke(UI)或者是 delegate.Begin ...

  2. 通过追源码解决:xmlrpc.client设定请求超时时间

    一.背景: 我们都知道,RPC本质是一个代理模式,是在HTTP或HTTPS请求上面做的封装,那么别人封装好了,拿过来用就好了.这样带来了极大的遍历,但也就导致了另外的问题,有的时候就是不够灵活.在py ...

  3. Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)...

    1. Future接口简介 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API ...

  4. php 脚本会超时吗,PHP脚本执行超时的解决办法

    PHP脚本执行超时的解决办法在php中默认脚本执行超时时间为30秒了,如果你未进行设置30秒之后如果你的脚本还未执行完就会超时了,下面我来给大详解解决PHP脚本执行超时的方法. php.ini 中缺省 ...

  5. spring事务中的超时时间很多人都不理解

    在spring中如何使用事务是一个很大的问题,其中有一个我需要在这篇文章中着重讲解一下,就是spring事务中的超时时间问题,很多同学不知道如何才能是这个超时时间生效,导致在使用过程中出现各种各样的问 ...

  6. Spring 事务超时时间

    问题:生产环境下插入大量数据,日志报错,数据最终没有入库,显示state报错. 测试和结论:Transactional中设置超时时间5秒,代码中先插入数据,后sleep数秒,没有报错.用另外一个线程更 ...

  7. Sql超时时间已到,在操作完成之前超时时间已过或服务器未响应。

    随着数据库数据的不断增大,查询时间也随之增长.而客户端与数据库连接时间以及命令的执行时间都是有限的.默认为30s. 所以在查询数据的时候,程序会出现 "超时时间已到.在操作完成之前超时时间已 ...

  8. Spring事务管理-超时时间

    关于Spring事务超时时间的实现,一直都没太弄清楚,终于在看到一篇事务超时文章后,通过测试用例证明通常情况下@Transactional中配置的timeout都是无效的. 首先说明下测试的注意事项, ...

  9. Mysql 超时时间设置

    1.建立数据库连接超时设置. jdbc:mysql://localhost:3306/gjm?connectTimeout=3000 connectTimeout:表示的是数据库驱动(mysql-co ...

最新文章

  1. 《SolidWorks 2017中文版机械设计从入门到精通)》——1.4 操作环境设置
  2. 第三课 弹性盒模型知识点
  3. 网络程序开发实验报告
  4. webpack 谷歌地图_如何在Webpack中设置可靠且可维护的Google Analytics(分析)
  5. java 23种设计模式详尽分析与实例解析_Java 23种设计模式详尽分析与实例解析之一--创建型模式...
  6. MyEclipse激活步骤
  7. H.264/AVC原理介绍
  8. ubuntu18.04 使用scrcpy将安卓手机投屏到电脑
  9. 软件测试度量的关键指标,软件测试度量指标简介
  10. Pandas实战-Series的方法
  11. 北京科技大学计算机专业在哪个校区,北京科技大学有几个校区及校区地址
  12. 第九章 数据库其他对象
  13. 中断优先级和中断线程优先级
  14. linux.x64_11gR2_database.zip下载
  15. 不要忘了我们心中的梦
  16. 月薪13K!一个“今日”胜于两个“明天”,努力前行,就能获得成功~
  17. 【光学】发散角的奥秘
  18. 又是一次!魔幻的虾皮裁员经历
  19. switch case 穿透
  20. MyEclipse/Eclipse 导出带目录结构的.class

热门文章

  1. mysql begin end 批量更新_MySql中4种批量更新的方法
  2. FPGA的设计艺术(15)逻辑设计及仿真利器之各式各样的循环
  3. HDLBits 系列(19) 12小时时钟的Verilog设计
  4. Xinlinx 7系列 FPGA 总览
  5. element-ui上传下载excel(超详细der)
  6. sql语句数据行操作-虽然一般不用
  7. getBytes等空指针异常
  8. 仓库管理系统gitlab
  9. 参加“北向峰会”后对SOC之感言
  10. Python 参考手册