线程池,封装使用,实现控制子线程
using System.Collections.Generic;
using System.Text;
using System.Threading;
namespace TxWeb.CnForums
{
public class TxThread
{
public delegate void Delegate(object obj);
/// <summary>
/// 执行指定的方法,如果在指定的时间之内没有完成,则中止
/// </summary>
/// <param name="func">任务过程</param>
/// <param name="threadID">帖子编号</param>
/// <param name="timeSpan">超时时间</param>
/// <param name="timeoutCallback">如果超时,则调用该方法</param>
/// <param name="updateID">变化主表记录编号</param>
/// <returns>是否正确执行完毕</returns>
public static bool Call(Delegate func, object threadID, TimeSpan timeSpan, Delegate timeoutCallback, object updateID)
{
if (func == null)
throw new ArgumentNullException("func");
ManualResetEvent resetEvent = new ManualResetEvent(false);
ManualResetEvent waitThreadEvent = new ManualResetEvent(false);
Exception error = null;
Thread thread = null;
// 将任务加到线程当中
ThreadPool.QueueUserWorkItem(delegate
{
thread = Thread.CurrentThread;
try { func(threadID); }
catch (ThreadAbortException) { }
catch (Exception ex) { error = ex; }
resetEvent.Set();
// 每次线程执行结束都等待后续的处理逻辑
waitThreadEvent.WaitOne();
});
try
{
// 等待任务的结束
bool result = resetEvent.WaitOne(timeSpan, false);
// 说明在执行过程中出现异常,直接抛出异常
if (error != null)
{
throw error;
}
if (!result)
{
if (thread != null)
{
// 此时可以确保该线程没有开始运行新的任务
thread.Abort();
waitThreadEvent.Set();
}
if (timeoutCallback != null)
timeoutCallback(updateID);
}
return result;
}
finally
{
// 最后确保释放线程池线程
waitThreadEvent.Set();
}
}
}
}
TxWeb.CnForums.TxThread.Delegate dealOverTime = new TxWeb.CnForums.TxThread.Delegate(DealOverTime);
TxWeb.CnForums.TxThread.Call(createHtml, threadID, TimeSpan.FromSeconds(OverTime), dealOverTime, updateID);
转载于:https://www.cnblogs.com/dajiang02/archive/2011/11/25/2263100.html
线程池,封装使用,实现控制子线程相关推荐
- 【线程池封装】实现简单回射服务器
图.1 线程池框架 半同步/半反应堆模式(半同步/半异步模式的变体) 类封装: template<typename T> class ThreadPool {public:ThreadPo ...
- Android线程池封装库
目录介绍 1.遇到的问题和需求 1.1 遇到的问题有哪些 1.2 遇到的需求 1.3 多线程通过实现Runnable弊端 1.4 为什么要用线程池 2.封装库具有的功能 2.1 常用的功能 3.封装库 ...
- android 多线程封装,Android线程池封装库
目录介绍 1.遇到的问题和需求 1.1 遇到的问题有哪些 1.2 遇到的需求 1.3 多线程通过实现Runnable弊端 1.4 为什么要用线程池 2.封装库具有的功能 2.1 常用的功能 3.封装库 ...
- 浅谈线程池(中):独立线程池的作用及IO线程池
在上一篇文章中,我们简单讨论了线程池的作用,以及CLR线程池的一些特性.不过关于线程池的基本概念还没有结束,这次我们再来补充一些必要的信息,有助于我们在程序中选择合适的使用方式. 独立线程池 上次我们 ...
- hystrix 源码 线程池隔离_基于hystrix的线程池隔离
hystrix进行资源隔离,其实是提供了一个抽象,叫做command,就是说,你如果要把对某一个依赖服务的所有调用请求,全部隔离在同一份资源池内 对这个依赖服务的所有调用请求,全部走这个资源池内的资源 ...
- QT 线程池 + TCP 小试(一)线程池的简单实现
*免分资源链接点击打开链接http://download.csdn.net/detail/goldenhawking/4492378 很久以前做过ACE + MFC/QT 的中轻量级线程池应用, ...
- java线程池详解及五种线程池方法详解
基础知识 Executors创建线程池 Java中创建线程池很简单,只需要调用Executors中相应的便捷方法即可,比如Executors.newFixedThreadPool(int nThrea ...
- mongodb线程池_常用高并发网络线程模型设计及MongoDB线程模型优化实践
服务端通常需要支持高并发业务访问,如何设计优秀的服务端网络IO工作线程/进程模型对业务的高并发访问需求起着至关重要的核心作用. 本文总结了了不同场景下的多种网络IO线程/进程模型,并给出了各种模型的优 ...
- 为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...
我还记得大学实习面试时,被问到什么是线程池这个问题,因为这个题我被录取了,原因就是我背出来了,而另外一个面试的没背出来,说实话当时还真不知道它是干什么的,就是看面试题给背下来了,在之后就是在实际开发中 ...
- 线程池原理及C语言实现线程池
备注:该线程池源码参考自传直播客培训视频配套资料: 源码:https://pan.baidu.com/s/1zWuoE3q0KT5TUjmPKTb1lw 密码:pp42 引言:线程池是一种多线程处理形 ...
最新文章
- 异常解决(一)-- RuntimeError: expected device cpu but got device cuda:0
- java在dos中如何测试_[求助]怎么在java中模拟dos命令行
- 关于OC-省市区习题
- Java8排序–性能陷阱
- mysql jdbc 单利_java单利模式设计
- 我喜欢现在的工作环境不错工资待遇一般
- 十八年开发经验分享(一)学习篇
- MFC中CDC画线总结
- 小米浏览器 解析html5,JavaScript - 判断当前用户使用的浏览器
- Linux 如何对http服务器进行压力测试
- Linux内核学习(二)编写最简单的字符设备驱动
- E4A影视APP源码电视盒子酷点TV版4.5 后端对接苹果cms
- Linux下安装Oracle12c图形化及静默两种方法安装操作手册
- 聊聊iClient for Leaflet坐标转换问题
- MIT 心拍类型注释
- zookeeper原理:分布式协同技术
- unity建立项目崩溃:failed to decompress
- C语言运算符优先级及结合性
- 口红试色app开发,轻松找到满意的口红色号
- ES6 模块 export 用法(三种方式)
热门文章
- Android 开源项目android-open-project工具库解析之(一) 依赖注入,图片缓存,网络相关,数据库orm工具包,Android公共库...
- ubuntu14.04 下emacs 24 配置
- Android中GridView使用总结
- SharePoint WebPart:扩展SharePoint 2007中图片展示功能
- 不可多得的Javascript(AJAX)开发工具 - Aptana
- Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
- JS Event事件
- iPhone与Android手机 各个型号的UserAgent
- Codeigniter CRUD代码快速构建
- Navigation Drawer详解-Google推出的用来取代Sliding Menu的控件(一