如何让.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了大半天,竟然没有找到分表 ...
随机推荐
- 使用 Python 实现命令行词典(一)
最近经常在服务器上开发,经常会遇到不认识的单词,然而 linux 下实在没有什么好用的词典,索性自己写一个好了. 词典 API 首先,Google 了一下可用的词典的 API,发现金山的 iciba ...
- Linux 上搭建 git 的服务器
搭建服务器 假设服务器的名字是 git.example.com. 首先,添加一个叫做git的用户adduser git. 然后如果不存在的话, 为这个用户新建一个主目录mkdir /home/git, ...
- Express - 入门
Express入门篇 1.HelloWorld 根目录新建server.js文件,插入代码: var express = require('express'); var app = express( ...
- seajs模块标识命名和解析规则
模块标识采用路径形式,但要注意与路径的区别.require.require.async的第一个参数是模块标识.而seajs.use第一个参数为文件路径. use是全局的,require是局部的.模块标 ...
- oracle linux 6.5 安装 oracle 12cR2数据库(2)-DBCA建库
援引:http://www.cnblogs.com/kerrycode/p/3386917.html by 潇湘隐者 Oracle 12C引入了CDB与PDB的新特性,在ORACLE 12C数据库引 ...
- lock invoke 死锁事例
代码如下: using System; using System.Collections.Generic; using System.Windows.Forms; using System.Threa ...
- redis单机主从搭建
tar zxvf redis-2.8.13.tar.gz cd redis-2.8.13 make 1.安装主库 mkdir /opt/redis/sbin -p mkdir /opt/redi ...
- Python之collections序列迭代器下标式循环冒泡算法等
练习题 元素分类 有如下值集合[11,22,33,44,55,66,77,88,99]将所有大于66的数作为一个列表放在字典的key为k1的value小于等于66的为k2的value {'k1':[7 ...
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(83)-Easyui Datagrid 行内编辑扩展
这次我们要从复杂的交互入手来说明一些用法,这才能让系统做出更加复杂的业务,上一节讲述了Datagird的批量编辑和提交本节主要演示扩展Datagrid行内编辑的属性,下面来看一个例子,我开启编辑行的时 ...
- Linux安装yum以及更新yum版本
.使用RedHat系统不能正常使用yum安装 由于RedHat没有注册,所有不能使用它自身的资源更新,于是使用yum instatll gcc-c++的时候出现This system is not r ...