如何让.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();
如何让.Net线程支持超时后并自动销毁!的更多相关文章
- .NET:如何让线程支持超时?
背景 本文是为了回复博客园一个兄弟的问题,主要回答两个问题: 如何让线程支持超时? 如何让线程在执行结束后销毁? MS 现在不推荐使用低级别的 Thread 编程,而推荐使用 Task,另外我多数情况 ...
- java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)
多线程应用中,经常会遇到这种场景:后面的处理,依赖前面的N个线程的处理结果,必须等前面的线程执行完毕后,后面的代码才允许执行. 在我不知道CyclicBarrier之前,最容易想到的就是放置一个公用的 ...
- Java学习笔记——Java程序运行超时后退出或进行其他操作的实现
当程序进入死循环或者由于其他原因无法自行终止的时候,就需要强制退出程序了. 对于开发软件 Eclipse ,在程序执行超时后,可以点击 Terminate 按钮强制退出. 那么,我们可不可以通过程序设 ...
- Quartz Scheduler misfireThreshold属性的意义与触发器超时后的处理策略
Quartz misfireThreshold属性的意义与触发器超时后的处理策略. 在配置quartz.properties有这么一个属性就是misfireThreshold,用来指定调度引擎设置触发 ...
- Qt入门(9)——Qt中的线程支持
Qt对线程提供了支持,基本形式有独立于平台的线程类.线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法.警告:所有的GUI类(比如,QWidget和它的子类),操作系统核心 ...
- wait()方法写在while循环中可以在线程接到通知后再一次判断条件
wait()方法写在while循环中可以在线程接到通知后再一次判断条件 synchronized public String pop() { String returnValue = "&q ...
- 只用css实现“每列四行,加载完一列后数据自动填充到下一列”的效果
只用css实现“每列四行,加载完一列后数据自动填充到下一列”的效果.这个题目用图表示如下: 如果将题目换成“只用css实现每行四列,加载完一行后数据自动填充到下一行”,那这个问题就简单多了,相信大家都 ...
- 同步的数据过大,导致shareplex超时,并自动kill掉了同步会话
数据库迁移,其中有个数据量较大的表的索引,在迁移的时候出现,同步超时的情况 Notice 2014-08-05 15:14:54.856107 14240 3892311808 Poster: Ope ...
- 支持MySql的数据库自动分表工具DBShardTools发布
支持MySql的数据库自动分表工具DBShardTools发布 前段时间参与了公司的一个项目,这个项目的特点是数据量.访问量都比较大,考虑使用数据库水平分表策略,Google了大半天,竟然没有找到分表 ...
随机推荐
- Oracle数据泵(上)
导出 (以导出表空间为例) 1.给用户创建密码 alter user system identified by 00000000; 2.创建导出目录 create or replace dire ...
- JQuery Ajax使用及注意事项
定义和用法 ajax() 方法通过 HTTP 请求加载远程数据. 该方法是 jQuery 底层 AJAX 实现.简单易用的高层实现见 $.get, $.post 等.$.ajax() 返回其创建的 X ...
- 关于BSTR和SysStringLen方法的简单研究
英文的我编不下去了,所以还是先写个中文的吧, 之前遇到了SysStringLen求Bstr长度不正确的问题,试验了几次都不行的情况下我觉得可能是这个方法的bug,所以就没管. 大概的情况是这样: in ...
- document.all 用法
一. document.all是页面内所有元素的一个集合.例如: document.all(0)表示页面内第一个元素 二. document.all可以判断浏览器是否是IE if ...
- jQuery遍历节点方法汇总
1.children()方法:$('div').children()---遍历查找div元素的所有子元素节点 <p>Hello</p> <div> <span ...
- 在centos7下安装python3
环境搭建 准备工具: centos7:http://mirror.bit.edu.cn/centos/7/isos/x86_64/CentOS-7-x86_64-DVD-1611.iso virtus ...
- 基于HTML5快速搭建TP-LINK电信拓扑设备面板
今天我们以真实的TP-LINK设备面板为模型,完成设备面板的搭建,和指示灯的闪烁和图元流动. 先来目睹下最终的实现效果:http://www.hightopo.com/demo/blog_tplink ...
- Java中的Object、T(泛型)、?区别
因为最近重新看了泛型,又看了些反射,导致我对Object.T(以下代指泛型).?产生了疑惑. 我们先来试着理解一下Object类,学习Java的应该都知道Object是所有类的父类,注意:那么这就意味 ...
- PHP导出生成excel文件
composer包管理工具还是非常好用的 下载安装的扩展比较靠谱 无需自己解决扩展BUG 省时省力提高效率 1.下载安装composer自行百度 2.通过composer下载安装office 3.不在 ...
- 瀑布流布局使用详解——JQuery插件Isotope(动态实现子项目筛选)
瀑布流布局,听起来听牛逼的样子,其实就是简单的子元素筛选功能.不过这一功能在网站页面布局当中还是很常用的,特别是在电商网站中 经常会有点一个钮筛选,然后页面的子元素刷的以下变了样.接下来,我们先简单介 ...