如何让.Net线程支持超时后并自动销毁!
现实生活中,我们往往会遇到,要执行一个线程的方法,假如这个方法特别耗时,我怎么才能在指定的线程超时时间内,取消执行,并把线程销毁!以下是本人总结的常见几种方式!特此做下笔记!
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线程支持超时后并自动销毁!相关推荐
- java new一个线程执行完后会自动销毁吗_Java基础总结,超级全的面试题
1. static关键字是什么意思?Java 中是否可以覆盖(override)一个 private 或者是 static 的方法?是否可以在 static 环境中访问非static 变量? stat ...
- .NET:如何让线程支持超时?
背景 本文是为了回复博客园一个兄弟的问题,主要回答两个问题: 如何让线程支持超时? 如何让线程在执行结束后销毁? MS 现在不推荐使用低级别的 Thread 编程,而推荐使用 Task,另外我多数情况 ...
- javax线程池超时结束_没有Javax的Jakarta EE:这次世界也不会结束
javax线程池超时结束 如果您错过了新闻, Oracle将向Eclipse基金会捐赠Java EE规范 . 这个决定是在规范过程中进行了相当长时间的Hibernate之后,人们理所当然地怀疑Orac ...
- linux c实现线程超时退出,c – 如何在另一个线程的超时内唤醒select()
根据"男人选择"信息: "On success, select() and pselect() return the number of file descrip‐ to ...
- Java学习笔记——Java程序运行超时后退出或进行其他操作的实现
当程序进入死循环或者由于其他原因无法自行终止的时候,就需要强制退出程序了. 对于开发软件 Eclipse ,在程序执行超时后,可以点击 Terminate 按钮强制退出. 那么,我们可不可以通过程序设 ...
- java redirect 超时_会话超时后,Spring安全性不会重定向到上次请求的页面登录
首先启用并发会话控制支持是在以下位置添加以下侦听器web.xml: org.springframework.security.web.session.HttpSessionEventPublisher ...
- java 线程池超时_线程池中如何控制超时时间?
线程池构造方法不能控制任务的超时时间, java.util.concurrent.ThreadPoolExecutor#ThreadPoolExecutor(int, int, long, java. ...
- java 主线程等待_JAVA 主线程等待子线程执行完毕后在执行。线程同步 | 学步园...
线程同步器机制有: 障栏: 倒计时门栓: 交换器: 同步队列: 信号量: 需求描述: 最近项目需要实现批量请求另外一个http协议的接口处理业务信息,并根据处理结果的返回值,更新系统业务状态. 鉴于系 ...
- java 超时中断_怎么在超时后中断任务的ExecutorService
在超时后中断任务的ExecutorService 我在找一个行政服务可以提供超时的实现.提交给ExecutorService的任务如果花费的时间超过运行超时时间,就会中断.实现这样一个猛兽并不是那么困 ...
最新文章
- 美好生活从java开始
- virtualbox中Centos6.6和windows共享文件夹设置
- BZOJ4890 Tjoi2017城市
- 实战SQL Server 2005镜像配置全过程
- 50%企业数据治理失败!这9大要素才是成功关键
- python chardet_Python - chardet
- 如何给Exadata数据库一体机打补丁patching图解
- H5 - template native模板 实现列表布局
- 【Allennlp】: Allennlp中的test_data
- openwrt中br-lan,eth0,eth0.1,eth0.2
- word中插入题注 表1 图1
- HIVE函数集合(全)
- Chapter16/17-项目2:数据可视化
- Ubuntu鼠标移动中闪烁解决方法
- 自车坐标系下的物体相对和绝对位置和速度计算
- Rust 中的指针:Box、Rc、Cell、RefCell
- python 遥感图像分类
- spss/amos评价分类(问卷调查)matlab(模糊综合评价+AHP层次分析法模型)
- CentOS系统下Tomcat无法正常启动解决(8005端口不能启动)
- zabbix自定义报警——(邮箱,微信)
热门文章
- sqlserver201无效的许可证书_sql提示无效数字
- AcWing 1978. 奶牛过马路(前缀和)
- 第二单元答案计算机基础,《计算机基础》资源包-第二单元课后题答案.docx
- Python数值特征转换
- column分栏布局只是文字布局吗_CSS3 column 分栏
- leetcode题解—1021、删除最外层的括号
- 查询和修改mysql最大连接数的方法
- mod libs 课堂
- 复杂业务下向Mysql导入30万条数据代码优化的踩坑记录
- WCF分布式开发常见错误(13):此方法调用的事务被异步中断