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

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线程支持超时后并自动销毁!的更多相关文章

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

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

  2. java并发编程学习:如何等待多个线程执行完成后再继续后续处理(synchronized、join、FutureTask、CyclicBarrier)

    多线程应用中,经常会遇到这种场景:后面的处理,依赖前面的N个线程的处理结果,必须等前面的线程执行完毕后,后面的代码才允许执行. 在我不知道CyclicBarrier之前,最容易想到的就是放置一个公用的 ...

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

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

  4. Quartz Scheduler misfireThreshold属性的意义与触发器超时后的处理策略

    Quartz misfireThreshold属性的意义与触发器超时后的处理策略. 在配置quartz.properties有这么一个属性就是misfireThreshold,用来指定调度引擎设置触发 ...

  5. Qt入门(9)——Qt中的线程支持

    Qt对线程提供了支持,基本形式有独立于平台的线程类.线程安全方式的事件传递和一个全局Qt库互斥量允许你可以从不同的线程调用Qt方法.警告:所有的GUI类(比如,QWidget和它的子类),操作系统核心 ...

  6. wait()方法写在while循环中可以在线程接到通知后再一次判断条件

    wait()方法写在while循环中可以在线程接到通知后再一次判断条件 synchronized public String pop() { String returnValue = "&q ...

  7. 只用css实现“每列四行,加载完一列后数据自动填充到下一列”的效果

    只用css实现“每列四行,加载完一列后数据自动填充到下一列”的效果.这个题目用图表示如下: 如果将题目换成“只用css实现每行四列,加载完一行后数据自动填充到下一行”,那这个问题就简单多了,相信大家都 ...

  8. 同步的数据过大,导致shareplex超时,并自动kill掉了同步会话

    数据库迁移,其中有个数据量较大的表的索引,在迁移的时候出现,同步超时的情况 Notice 2014-08-05 15:14:54.856107 14240 3892311808 Poster: Ope ...

  9. 支持MySql的数据库自动分表工具DBShardTools发布

    支持MySql的数据库自动分表工具DBShardTools发布 前段时间参与了公司的一个项目,这个项目的特点是数据量.访问量都比较大,考虑使用数据库水平分表策略,Google了大半天,竟然没有找到分表 ...

随机推荐

  1. easyUI中datagrid的使用

    easyUI中的datagrid数据表格经常被用到,结合项目中的使用情况,总结一下datagrid使用中需要注意的一些问题.使用datagrid展示数据,需要在html.css.js中都要编写代码,h ...

  2. 案例分享|某医药集团的BI建设案例

    相比于传统型BI,越来越多的企业开始接受并青睐新型的自助式BI,因其项目上线快,失败风险小,简单易用,颇受赞誉.以下是某医药集团上线帆软BI系统FineBI的案例,从用途架构.指标分析.和信息交互几方 ...

  3. JavaScript知识点整理 (二)

    1)函数概述 1.函数是一块 JS 代码,被定义一次,但可以执行和调用多次. JS 中的函数也是对象,所以 JS 函数可以像其它对象那样操作和传递,所以也常叫 JS 中的函数为函数对象. 2.函数也是 ...

  4. OC—不可变字符串NSString

  5. zen coding一个牛的不行的html和css开发工具

    zen coding 是一种仿css选择器的语法来快速开发html和css的开源项目.现已更名为Emmet.可以到github上下载拜读.在这个都想偷懒的世界里,此方法可以极大的缩短开发人员的开发时间 ...

  6. Servlet简单总结(一)

    一.Servlet简单总结 1.1. 什么是Servlet Servlet是JavaEE三大组建之一,是使用Java语言编写服务器端的程序,主要用来处理Web应用程序中的请求-响应.Servlet并没 ...

  7. NancyFx 2.0的开源框架的使用-Stateless(二)

    继续上一篇Stateless的博文,在上一篇的博文的基础上稍微加点东西 接下来右键解决方案添加新项目,一样建一个空的Web项目 然后在StatelessDemoWeb项目里面添加Views文件夹,Sc ...

  8. docker对cpu使用及在kubernetes中的应用

    docker对CPU的使用 docker对于CPU的可配置的主要几个参数如下: --cpu-shares CPU shares (relative weight) --cpu-period Limit ...

  9. 《JavaScript高级程序设计》里对 call() 和 apply() 的解释 (116页)

    每个函数都包含两个非继承而来的方法:apply()和call().这两个方法的用途都是在特定的作用域中调用函数,实际上等于设置函数体内this对象的值. apply(): 方法接受两个参数:一个是在其 ...

  10. 在CentOS上使用Jexus托管运行 ZKEACMS

    ZKEACMS Core 是基于 .net core 开发的,可以在 windows, linux, mac 上跨平台运行,接下来我们来看看如何在 CentOS 上使用Jexus托管运行 ZKEACM ...