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

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

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

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

但是这样做时,某些代码或者是某个方法的执行超时的时间还是无法操控的。

那么我们又是否有一种比较通用的方法、来设定某一个方法的执行超时的时间,让其一旦超过指定时间则跳出指定方法、进而继续向下执行呢?

答案当然是肯定的。

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

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

相关的实现代码如下:

public delegate voidDoHandler();public classTimeout

{privateManualResetEvent mTimeoutObject;//标记变量

private boolmBoTimeout;publicDoHandler Do;publicTimeout()

{//初始状态为 停止

this.mTimeoutObject = new ManualResetEvent(true);

}///

///指定超时时间 异步执行某个方法///

///执行 是否超时

public boolDoWithTimeout(TimeSpan timeSpan)

{if (this.Do == null)

{return false;

}this.mTimeoutObject.Reset();this.mBoTimeout = true; //标记

this.Do.BeginInvoke(DoAsyncCallBack, null);//等待 信号Set

if (!this.mTimeoutObject.WaitOne(timeSpan, false))

{this.mBoTimeout = true;

}return this.mBoTimeout;

}///

///异步委托 回调函数///

///

private voidDoAsyncCallBack(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 staticStopwatch watch;private staticSystem.Threading.Timer timer;static void Main(string[] args)

{

watch= newStopwatch();

Timeout timeout= newTimeout();

timeout.Do= newProgram().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= newTimeout();

timeout.Do= newProgram().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(objectobj)

{

Console.WriteLine(string.Format("运行时间:{0}秒", watch.Elapsed.TotalSeconds.ToString("F2")));

}public voidDoSomething()

{//休眠 5秒

System.Threading.Thread.Sleep(new TimeSpan(0, 0, 0, 5));

}

View Code

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

更多相关:

  • 传参 如果程序执行的时候需要加入参数,如 ./sample aa bb 使用 gdb 的时候可以使用如下方式 gdb --args ./sample aa bb 执行 启动 gdb 之后,直接使用 r,就是 run 的意思,或者可以使用 b 加一个断点进行调试。处理信号 如果在使用的时候,遇到类似下面的报错 Threa...

  • 进程的图文形象表示 阮一峰–进程与线程的一个简单解释 多进程实质 现在,多核CPU已经非常普及了,但是,即使过去的单核CPU,也可以执行多任务。由于CPU执行代码都是顺序执行的,那么,单核CPU是怎么执行多任务的呢? 答案就是操作系统轮流让各个任务交替执行,任务1执行0.01秒,切换到任务2,任务2执行0.01秒,再切换到任务...

  • redis 事物: Redis 事物的实现: 首先 wath监控键值 myKey开启批量执行 multi,执行命令入列,执行 exec 。如果监控的键值mykey 没有被修改过,则exec 中批量执行的命令成功,否则执行失败。无论执行成功与否,都会执行取消wath的执行  Redis multi 批量执行,是先把批量中的命令放入队列...

  • 一、准备工作: 1.登录服务器,切换到root用户(su - root,然后输入密码,按enter),进入根目录:cd / 2.进入要安装jdk的目录,自己可以创建一个java目录,执行命令如下: cd /usr/local/ mkdir java 二、下载安装包 1.打开官网下载界面:https://www.oracle.com/...

  • 当百万数据时,如果修改主键,那么会自动重建索引,所以操作会非常慢,经常会超时,错误提示类似: 超时时间已到。在操作完成之前超时时间已过或服务器未响应 解决方案:不要采用手动添加主键或者索引,而采用sql语句修改主键或者索引,当然很多人这个sql不会写,也不要紧,sql自带了,两步走,第一:点开表设计,添加一个索引或者主键,如图...

  • 来源:公众号|计算机视觉工坊(系投稿)作者:仲夏夜之星「3D视觉工坊」技术交流群已经成立,目前大约有12000人,方向主要涉及3D视觉、CV&深度学习、SLAM、三维重建、点云后处理、自动驾驶、CV入门、三维测量、VR/AR、3D人脸识别、医疗影像、缺陷检测、行人重识别、目标跟踪、视觉产品落地、视觉竞赛、车牌识别、硬件选型、学术交流、...

  • 点云PCL免费知识星球,点云论文速读。文章:Real-Time LIDAR-Based Urban Road and Sidewalk Detection for Autonomous Vehicles作者:Ern˝o Horváth  , Claudiu Pozna ,and Miklós Unger编译:点云PCL代码:http...

  • 文章:Semantic Histogram Based Graph Matching for Real-Time Multi-Robot Global Localization in Large Scale Environment作者:Xiyue Guo, Junjie Hu, Junfeng Chen, Fuqin Deng, T...

  • 点云PCL免费知识星球,点云论文速读。文章:Robust Place Recognition using an Imaging Lidar作者:Tixiao Shan, Brendan Englot, Fabio Duarte, Carlo Ratti, and Daniela Rus编译:点云PCL(ICRA 2021)开源代码:...

  • 文章:A Survey of Calibration Methods for Optical See-Through Head-Mounted Displays作者:Jens Grubert , Yuta Itoh, Kenneth Moser编译:点云PCL本文仅做学术分享,如有侵权,请联系删除。欢迎各位加入免费知识星球,获取PD...