类代码

 
using System;
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 createHtml = new TxWeb.CnForums.TxThread.Delegate(CreateHtml);
                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. 【线程池封装】实现简单回射服务器

    图.1 线程池框架 半同步/半反应堆模式(半同步/半异步模式的变体) 类封装: template<typename T> class ThreadPool {public:ThreadPo ...

  2. Android线程池封装库

    目录介绍 1.遇到的问题和需求 1.1 遇到的问题有哪些 1.2 遇到的需求 1.3 多线程通过实现Runnable弊端 1.4 为什么要用线程池 2.封装库具有的功能 2.1 常用的功能 3.封装库 ...

  3. android 多线程封装,Android线程池封装库

    目录介绍 1.遇到的问题和需求 1.1 遇到的问题有哪些 1.2 遇到的需求 1.3 多线程通过实现Runnable弊端 1.4 为什么要用线程池 2.封装库具有的功能 2.1 常用的功能 3.封装库 ...

  4. 浅谈线程池(中):独立线程池的作用及IO线程池

    在上一篇文章中,我们简单讨论了线程池的作用,以及CLR线程池的一些特性.不过关于线程池的基本概念还没有结束,这次我们再来补充一些必要的信息,有助于我们在程序中选择合适的使用方式. 独立线程池 上次我们 ...

  5. hystrix 源码 线程池隔离_基于hystrix的线程池隔离

    hystrix进行资源隔离,其实是提供了一个抽象,叫做command,就是说,你如果要把对某一个依赖服务的所有调用请求,全部隔离在同一份资源池内 对这个依赖服务的所有调用请求,全部走这个资源池内的资源 ...

  6. QT 线程池 + TCP 小试(一)线程池的简单实现

     *免分资源链接点击打开链接http://download.csdn.net/detail/goldenhawking/4492378 很久以前做过ACE + MFC/QT 的中轻量级线程池应用, ...

  7. java线程池详解及五种线程池方法详解

    基础知识 Executors创建线程池 Java中创建线程池很简单,只需要调用Executors中相应的便捷方法即可,比如Executors.newFixedThreadPool(int nThrea ...

  8. mongodb线程池_常用高并发网络线程模型设计及MongoDB线程模型优化实践

    服务端通常需要支持高并发业务访问,如何设计优秀的服务端网络IO工作线程/进程模型对业务的高并发访问需求起着至关重要的核心作用. 本文总结了了不同场景下的多种网络IO线程/进程模型,并给出了各种模型的优 ...

  9. 为什么线程池里的方法会执行两次_面试官问你java都有哪些线程池,自己是否自定义过线程池...

    我还记得大学实习面试时,被问到什么是线程池这个问题,因为这个题我被录取了,原因就是我背出来了,而另外一个面试的没背出来,说实话当时还真不知道它是干什么的,就是看面试题给背下来了,在之后就是在实际开发中 ...

  10. 线程池原理及C语言实现线程池

    备注:该线程池源码参考自传直播客培训视频配套资料: 源码:https://pan.baidu.com/s/1zWuoE3q0KT5TUjmPKTb1lw 密码:pp42 引言:线程池是一种多线程处理形 ...

最新文章

  1. 异常解决(一)-- RuntimeError: expected device cpu but got device cuda:0
  2. java在dos中如何测试_[求助]怎么在java中模拟dos命令行
  3. 关于OC-省市区习题
  4. Java8排序–性能陷阱
  5. mysql jdbc 单利_java单利模式设计
  6. 我喜欢现在的工作环境不错工资待遇一般
  7. 十八年开发经验分享(一)学习篇
  8. MFC中CDC画线总结
  9. 小米浏览器 解析html5,JavaScript - 判断当前用户使用的浏览器
  10. Linux 如何对http服务器进行压力测试
  11. Linux内核学习(二)编写最简单的字符设备驱动
  12. E4A影视APP源码电视盒子酷点TV版4.5 后端对接苹果cms
  13. Linux下安装Oracle12c图形化及静默两种方法安装操作手册
  14. 聊聊iClient for Leaflet坐标转换问题
  15. MIT 心拍类型注释
  16. zookeeper原理:分布式协同技术
  17. unity建立项目崩溃:failed to decompress
  18. C语言运算符优先级及结合性
  19. 口红试色app开发,轻松找到满意的口红色号
  20. ES6 模块 export 用法(三种方式)

热门文章

  1. Android 开源项目android-open-project工具库解析之(一) 依赖注入,图片缓存,网络相关,数据库orm工具包,Android公共库...
  2. ubuntu14.04 下emacs 24 配置
  3. Android中GridView使用总结
  4. SharePoint WebPart:扩展SharePoint 2007中图片展示功能
  5. 不可多得的Javascript(AJAX)开发工具 - Aptana
  6. Javascript创建Silverlight Plugin以及自定义nonSilverlight和lowSilverlight样式
  7. JS Event事件
  8. iPhone与Android手机 各个型号的UserAgent
  9. Codeigniter CRUD代码快速构建
  10. Navigation Drawer详解-Google推出的用来取代Sliding Menu的控件(一