现实生活中,我们往往会遇到,要执行一个线程的方法,假如这个方法特别耗时,我怎么才能在指定的线程超时时间内,取消执行,并把线程销毁!以下是本人总结的常见几种方式!特此做下笔记!

1.使用CancellationTokenSource之基于Task实现方式

CancellationTokenSource source = new CancellationTokenSource();source.CancelAfter(TimeSpan.FromMilliseconds(2000));Task task=Task.Factory.StartNew(() =>{while (true){try{source.Token.ThrowIfCancellationRequested();Console.WriteLine("子方法执行中...");Thread.Sleep(1000);Console.WriteLine("子方法执行完毕...");}catch (OperationCanceledException ex){Console.WriteLine("已捕获取消异常:" + ex.Message);break;}catch (Exception ex){Console.WriteLine("异常:" + ex.Message);break;}}Console.WriteLine("线程已终止");}, source.Token);

2.使用CancellationTokenSource之基于Thread实现方式

 CancellationTokenSource source = new CancellationTokenSource();Thread thread = new Thread(new ThreadStart(() =>{while (true){Console.WriteLine("现在时间:"+DateTime.Now);}}));thread.IsBackground = true;thread.Start();source.Token.Register(() =>{Console.WriteLine("超时时间已到,开始终止线程");thread.Abort();Console.WriteLine("超时时间已到,终止线程完成");});source.CancelAfter(2000);

3.基于Thread.Join()实现

 Thread thread =new Thread(new ThreadStart(() =>{while (true){Console.WriteLine("现在时间:"+DateTime.Now);}}));thread.Start();thread.Join(2000);Console.WriteLine("join超时时间已到,开始终止线程");thread.Abort();Console.WriteLine("join超时时间已到,终止线程完成");

4.基于System.Timers.Timer的实现方式

DateTime dtNow = DateTime.Now;Thread thread = new Thread(new ThreadStart(() =>{while (true){Console.WriteLine("现在时间:" + DateTime.Now);}}));thread.IsBackground = true;thread.Start();System.Timers.Timer timer = new System.Timers.Timer();timer.Interval = 1000;timer.Elapsed += (sender,e) =>{double db=DateTime.Now.Subtract(dtNow).TotalSeconds;if (db > 2)//大于2秒说明已经超时{Console.WriteLine("任务已执行超过了:" + db + "秒");Console.WriteLine("超时时间已到,开始终止线程");thread.Abort();Console.WriteLine("超时时间已到,终止线程完成");timer.Stop();}};timer.Start();

5.基于信号量和CancellationTokenSource的实现方式

AutoResetEvent autoReset = new AutoResetEvent(false);CancellationTokenSource source = new CancellationTokenSource();Task.Factory.StartNew(() =>{try{while (true){source.Token.ThrowIfCancellationRequested();Console.WriteLine("子线程:Work starting.");// Simulate time spent working.Thread.Sleep(5000);//new Random().Next(500, 2000)autoReset.Set();// Signal that work is finished.Console.WriteLine("子线程:Work ending.");}}catch (Exception e){autoReset.Set();Console.WriteLine("子线程收到异常:"+e.Message+",线程退出!");// throw;}}, source.Token);Console.WriteLine("主线程只等待1秒");autoReset.WaitOne(1000);//等待超过1秒,则需要取消该线程Console.WriteLine("主线程等待超时,开始继续执行,同时调用Source.Cancel()");source.Cancel();

转载于:https://www.cnblogs.com/taomylife/p/7027193.html

如何让.Net线程支持超时后并自动销毁!相关推荐

  1. java new一个线程执行完后会自动销毁吗_Java基础总结,超级全的面试题

    1. static关键字是什么意思?Java 中是否可以覆盖(override)一个 private 或者是 static 的方法?是否可以在 static 环境中访问非static 变量? stat ...

  2. .NET:如何让线程支持超时?

    背景 本文是为了回复博客园一个兄弟的问题,主要回答两个问题: 如何让线程支持超时? 如何让线程在执行结束后销毁? MS 现在不推荐使用低级别的 Thread 编程,而推荐使用 Task,另外我多数情况 ...

  3. javax线程池超时结束_没有Javax的Jakarta EE:这次世界也不会结束

    javax线程池超时结束 如果您错过了新闻, Oracle将向Eclipse基金会捐赠Java EE规范 . 这个决定是在规范过程中进行了相当长时间的Hibernate之后,人们理所当然地怀疑Orac ...

  4. linux c实现线程超时退出,c – 如何在另一个线程的超时内唤醒select()

    根据"男人选择"信息: "On success, select() and pselect() return the number of file descrip‐ to ...

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

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

  6. java redirect 超时_会话超时后,Spring安全性不会重定向到上次请求的页面登录

    首先启用并发会话控制支持是在以下位置添加以下侦听器web.xml: org.springframework.security.web.session.HttpSessionEventPublisher ...

  7. java 线程池超时_线程池中如何控制超时时间?

    线程池构造方法不能控制任务的超时时间, java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor(int, int, long, java. ...

  8. java 主线程等待_JAVA 主线程等待子线程执行完毕后在执行。线程同步 | 学步园...

    线程同步器机制有: 障栏: 倒计时门栓: 交换器: 同步队列: 信号量: 需求描述: 最近项目需要实现批量请求另外一个http协议的接口处理业务信息,并根据处理结果的返回值,更新系统业务状态. 鉴于系 ...

  9. java 超时中断_怎么在超时后中断任务的ExecutorService

    在超时后中断任务的ExecutorService 我在找一个行政服务可以提供超时的实现.提交给ExecutorService的任务如果花费的时间超过运行超时时间,就会中断.实现这样一个猛兽并不是那么困 ...

最新文章

  1. 美好生活从java开始
  2. virtualbox中Centos6.6和windows共享文件夹设置
  3. BZOJ4890 Tjoi2017城市
  4. 实战SQL Server 2005镜像配置全过程
  5. 50%企业数据治理失败!这9大要素才是成功关键
  6. python chardet_Python - chardet
  7. 如何给Exadata数据库一体机打补丁patching图解
  8. H5 - template native模板 实现列表布局
  9. 【Allennlp】: Allennlp中的test_data
  10. openwrt中br-lan,eth0,eth0.1,eth0.2
  11. word中插入题注 表1 图1
  12. HIVE函数集合(全)
  13. Chapter16/17-项目2:数据可视化
  14. Ubuntu鼠标移动中闪烁解决方法
  15. 自车坐标系下的物体相对和绝对位置和速度计算
  16. Rust 中的指针:Box、Rc、Cell、RefCell
  17. python 遥感图像分类
  18. spss/amos评价分类(问卷调查)matlab(模糊综合评价+AHP层次分析法模型)
  19. CentOS系统下Tomcat无法正常启动解决(8005端口不能启动)
  20. zabbix自定义报警——(邮箱,微信)

热门文章

  1. sqlserver201无效的许可证书_sql提示无效数字
  2. AcWing 1978. 奶牛过马路(前缀和)
  3. 第二单元答案计算机基础,《计算机基础》资源包-第二单元课后题答案.docx
  4. Python数值特征转换
  5. column分栏布局只是文字布局吗_CSS3 column 分栏
  6. leetcode题解—1021、删除最外层的括号
  7. 查询和修改mysql最大连接数的方法
  8. mod libs 课堂
  9. 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录
  10. WCF分布式开发常见错误(13):此方法调用的事务被异步中断