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

在这时、我们可以通过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

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

  1. C# 给某个方法设定执行超时时间

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

  2. 进服务器网站报错应用程序,IIS:应用程序池中的服务器错误、超时时间已到

    网站前台现象:页面报错 问题现象:在服务器日志有: [为应用程序池 '×××' 提供服务的进程关闭时间超过了限制.进程 ID 是 '7480'.] 提示的ID可以有很多,例如3844.8004.612 ...

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

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

  4. 如何从校招脱颖而出?支付宝程序媛王妍岩:自信+方法

    简介: 请收好!加入支付宝梦之队的校招独家经验分享 就现在!蚂蚁「校招季」重磅来袭!除了介绍蚂蚁的技术大咖,我们还邀请了一些通过校招来到蚂蚁的过来人分享他们的通关经验和心得,这里随时可能有行业技术大咖 ...

  5. 新手编程:程序员 5 种编程入门方法,快速学会一门编程语言!

    程序员要精通一门语言,还是要掌握多门语言? 对于这个问题,公说公有理,婆说婆有理. 技术更新太快,精通一门编程语言已经实属不易,又怎么好意思说精通多门语言呢? 不过呢,当你精通一门语言同时,涉猎一下其 ...

  6. python中flush怎么用,在Python程序中操作文件之flush()方法的使用教程

    在Python程序中操作文件之flush()方法的使用教程 flush()方法刷新内部缓冲区,像标准输入输出的fflush.这类似文件的对象,无操作. Python关闭时自动刷新文件.但是可能要关闭任 ...

  7. 【U8+】U8+客户端提示“当前应用程序的使用期限已到”

    [问题现象] 在操作U8客户端使用的时候提示:当前应用程序的使用期限已到,系统将在60秒钟之后自动关闭,请及时保存数据. [排查方向] 1.是不是有其他人,在其他电脑上登录了同一个帐号. 2.是不是软 ...

  8. C# Winform应用程序占用内存较大解决方法整理(转)-- SetProcessWorkingSetSize

    一.C# Winform应用程序占用内存较大解决方法整理(转) 原文:  http://www.jb51.net/article/56682.htm 背景: 微软的 .NET FRAMEWORK 现在 ...

  9. scala akka_如何对Scala和Akka HTTP应用程序进行Docker化-简单的方法

    scala akka by Miguel Lopez 由Miguel Lopez 如何对Scala和Akka HTTP应用程序进行Docker化-简单的方法 (How to Dockerise a S ...

最新文章

  1. excel函数SUMPRODUCT
  2. ob_start()失效与phpunit的非正常结束
  3. C中的危险函数(缓冲区溢出)
  4. Oracle数据库管理
  5. CentOS6.9 下编译安装MySQL5.7.19
  6. RxJava + Java8 + Java EE 7 + Arquillian =幸福
  7. js有默认参数的函数加参数_函数参数:默认,关键字和任意
  8. 在HTML中插入JavaScript代码的方式
  9. gephi导入边数据时,和节点数据不在一个工作区
  10. Linus 将 Linux 的软盘驱动 floppy 标记为“孤立”状态
  11. mysql基础,索引
  12. (Java) Md5Utils
  13. hive 查询是否包含字符串_oracle判断一个字符串中是否包含另外一个字符串
  14. 使用Adobe Acrobat去除PDF文件签名
  15. bitmap位图方案解决海量数据文件排序的问题
  16. 财务分析真不难!无需代码,一个模板直接复用,碾压上千Excel表
  17. ASCII码 编码对照表
  18. 银河麒麟服务器操作系统V10SP2安装虚拟化管理软件
  19. MySQL获取汉字的拼音首字母
  20. 如何使用 Windows 电脑向 Android 设备安装 apk 应用

热门文章

  1. 制作一个老旧C118的GSM便携式测试设备
  2. MySQL 学习笔记(13)— 创建表、修改表、删除表、清空表
  3. git服务器搭建问题
  4. encodeURI 和 encodeURIComponent
  5. atitit.userService 用户系统设计 v5 q330
  6. YTU 2723: 默认参数--求圆的面积
  7. Tomcat 服务器的端口号的修改
  8. 微软安全新闻聚焦-双周刊第三十四期
  9. JQuery 基础:8.节点操作
  10. 走进人工智能,认识机器学习