C# 给某个方法设定执行超时时间
在某些情况下(例如通过网络访问数据),常常不希望程序卡住而占用太多时间以至于造成界面假死。
在这时、我们可以通过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# 给某个方法设定执行超时时间相关推荐
- c#程序设定使用期限_C# 给某个方法设定执行超时时间
在某些情况下(例如通过网络访问数据),常常不希望程序卡住而占用太多时间以至于造成界面假死. 在这时.我们可以通过Thread.Thread + Invoke(UI)或者是 delegate.Begin ...
- 通过追源码解决:xmlrpc.client设定请求超时时间
一.背景: 我们都知道,RPC本质是一个代理模式,是在HTTP或HTTPS请求上面做的封装,那么别人封装好了,拿过来用就好了.这样带来了极大的遍历,但也就导致了另外的问题,有的时候就是不够灵活.在py ...
- Java基础知识强化之网络编程笔记25:Android网络通信之 Future接口介绍(Java程序执行超时)...
1. Future接口简介 在Java中,如果需要设定代码执行的最长时间,即超时,可以用Java线程池ExecutorService类配合Future接口来实现. Future接口是Java标准API ...
- php 脚本会超时吗,PHP脚本执行超时的解决办法
PHP脚本执行超时的解决办法在php中默认脚本执行超时时间为30秒了,如果你未进行设置30秒之后如果你的脚本还未执行完就会超时了,下面我来给大详解解决PHP脚本执行超时的方法. php.ini 中缺省 ...
- spring事务中的超时时间很多人都不理解
在spring中如何使用事务是一个很大的问题,其中有一个我需要在这篇文章中着重讲解一下,就是spring事务中的超时时间问题,很多同学不知道如何才能是这个超时时间生效,导致在使用过程中出现各种各样的问 ...
- Spring 事务超时时间
问题:生产环境下插入大量数据,日志报错,数据最终没有入库,显示state报错. 测试和结论:Transactional中设置超时时间5秒,代码中先插入数据,后sleep数秒,没有报错.用另外一个线程更 ...
- Sql超时时间已到,在操作完成之前超时时间已过或服务器未响应。
随着数据库数据的不断增大,查询时间也随之增长.而客户端与数据库连接时间以及命令的执行时间都是有限的.默认为30s. 所以在查询数据的时候,程序会出现 "超时时间已到.在操作完成之前超时时间已 ...
- Spring事务管理-超时时间
关于Spring事务超时时间的实现,一直都没太弄清楚,终于在看到一篇事务超时文章后,通过测试用例证明通常情况下@Transactional中配置的timeout都是无效的. 首先说明下测试的注意事项, ...
- Mysql 超时时间设置
1.建立数据库连接超时设置. jdbc:mysql://localhost:3306/gjm?connectTimeout=3000 connectTimeout:表示的是数据库驱动(mysql-co ...
最新文章
- 《SolidWorks 2017中文版机械设计从入门到精通)》——1.4 操作环境设置
- 第三课 弹性盒模型知识点
- 网络程序开发实验报告
- webpack 谷歌地图_如何在Webpack中设置可靠且可维护的Google Analytics(分析)
- java 23种设计模式详尽分析与实例解析_Java 23种设计模式详尽分析与实例解析之一--创建型模式...
- MyEclipse激活步骤
- H.264/AVC原理介绍
- ubuntu18.04 使用scrcpy将安卓手机投屏到电脑
- 软件测试度量的关键指标,软件测试度量指标简介
- Pandas实战-Series的方法
- 北京科技大学计算机专业在哪个校区,北京科技大学有几个校区及校区地址
- 第九章 数据库其他对象
- 中断优先级和中断线程优先级
- linux.x64_11gR2_database.zip下载
- 不要忘了我们心中的梦
- 月薪13K!一个“今日”胜于两个“明天”,努力前行,就能获得成功~
- 【光学】发散角的奥秘
- 又是一次!魔幻的虾皮裁员经历
- switch case 穿透
- MyEclipse/Eclipse 导出带目录结构的.class