一个简易的、轻量级的方法并行执行线程辅助类   在实际应用中,经常要让多个方法并行执行以节约运行时间,线程就是必不可少的了,而多线程的管理经常又是一件头疼的事情,比如方法并行执行异步的返回问题,方法并行执行的超时问题等等,因此这里分享一个简易的、轻量级的方法并行执行线程辅助类。
  线程管理辅助类的两个目标:
  1、多个线程方法并行执行,主线程等待,需要知道所有子线程执行完毕;
  2、异步执行方法需要设置超时时间,超时可以跳过该方法,主线程直接返回;
  3、轻量级,虽然微软提供了线程等待、超时等可用组件,如ManualResetEvent,但那是内核对象,占用系统资源较多。
  设计实现:
  1、该类内部维护两个变量,异步执行方法总线程数totalThreadCount,当前执行完毕线程数据currThreadCount;
  2、两个开放方法,WaitAll等待执行,SetOne设置方法执行结束,每一个方法执行完毕调用SetOne,currThreadCount数量加1,同时WaitAll判断currThreadCount与totalThreadCount是否相等,相等即表示所有方法执行完毕,返回;
  3、为了实现线程安全,currThreadCount的变量处理使用Interlocked。
  代码实现:

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading; namespace Loncin.CodeGroup10.Utility
{
public class ThreadHelper
{
/// <summary>
/// 总线程数
/// </summary>
private int totalThreadCount; /// <summary>
/// 当前执行完毕线程数
/// </summary>
private int currThreadCount; /// <summary>
/// 构造函数
/// </summary>
/// <param name="totalThreadCount">总线程数</param>
public ThreadHelper(int totalThreadCount)
{
Interlocked.Exchange(ref this.totalThreadCount, totalThreadCount);
Interlocked.Exchange(ref this.currThreadCount, );
} /// <summary>
/// 等待所有线程执行完毕
/// </summary>
/// <param name="overMiniseconds">超时时间(毫秒)</param>
public void WaitAll(int overMiniseconds = )
{
int checkCount = ; // 自旋
while (Interlocked.CompareExchange(ref this.currThreadCount, , this.totalThreadCount) != this.totalThreadCount)
{
// 超过超时时间返回
if (overMiniseconds > )
{
if (checkCount >= overMiniseconds)
{
break;
}
} checkCount++; Thread.Sleep();
}
} /// <summary>
/// 设置信号量,表示单线程执行完毕
/// </summary>
public void SetOne()
{
Interlocked.Increment(ref this.currThreadCount);
}
}
}
 public class ThreadHelperTest
{
/// <summary>
/// 线程帮助类
/// </summary>
private ThreadHelper threadHelper; public void Test()
{
// 开启方法方法并行执行
int funcCount = ; this.threadHelper = new ThreadHelper(funcCount); for (int i = ; i < funcCount; i++)
{
Action<int> action = new Action<int>(TestFunc);
action.BeginInvoke(i, null, null);
} // 等待方法执行,超时时间12ms,12ms后强制结束
threadHelper.WaitAll(); Console.WriteLine("所有方法执行完毕!");
} private void TestFunc(int i)
{
try
{
Console.WriteLine("方法{0}执行!");
Thread.Sleep();
}
finally
{
// 方法执行结束
this.threadHelper.SetOne();
}
}
}

[C#]一个简易的、轻量级的方法并行执行线程辅助类的更多相关文章

  1. 一个简易的 LED 数字时钟实现方法

    这个应该是已经有很多人做过的东西,我应该只是算手痒,想写一下,所以,花了点时间折腾了这个,顺便把 Dark Mode 的处理也加上了. 首先可以很明确的一点,这个真没技术含量存在,只是需要点耐心. L ...

  2. Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)

    Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)                                                           ...

  3. 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具

    查看本章节 查看作业目录 需求说明: 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具 实现思路: 使用history对象中的 forward() 方法和 ...

  4. jquery+flask+keras+nsfw快速搭建一个简易鉴黄工具

    1. demo 地址:http://www.huchengchun.com:8127/porn_classification 接口说明: 1. http://www.huchengchun.com:8 ...

  5. .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”

    FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...

  6. 探秘Tomcat——一个简易的Servlet容器

    即便再简陋的服务器也是服务器,今天就来循着书本的第二章来看看如何实现一个servlet容器. 背景知识 既然说到servlet容器这个名词,我们首先要了解它到底是什么. servlet 相比你或多或少 ...

  7. [后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统

    一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...

  8. ENode 2.0 - 第一个真实案例剖析-一个简易论坛(Forum)

    前言 经过不断的坚持和努力,ENode 2.0的第一个真实案例终于出来了.这个案例是一个简易的论坛,开发这个论坛的初衷是为了验证用ENode框架来开发一个真实项目的可行性.目前这个论坛在UI上是使用了 ...

  9. 做了一个简易的git 代码自动部署脚本

    做了一个简易的git 代码自动部署脚本 http://my.oschina.net/caomenglong/blog/472665 发表于2个月前(2015-06-30 21:08)   阅读(200 ...

随机推荐

  1. selenium+python启动Firefox浏览器失败问题和点击登陆按钮无效问题

    问题1:使用python+selenium编写脚本调用Firefox时报错:

  2. gogs : 添加 ssh An error has occurred : addKey: fail to parse public key: exec: "ssh-keygen": executable file not found in %PATH% - exec: "ssh-keygen": executable file not found in %PATH%

    服务器上缺少配置   ssh-keygen.exe的 环境变量.git的环境变量 在path 环境变量加上.重启gogs服务

  3. MT【289】含参绝对值的最大值之三

    已知$a>0$,函数$f(x)=e^x+3ax^2-2e x-a+1$,(1)若$f(x)$在$[0,1]$上单调递减,求$a$的取值范围.(2)$|f(x)|\le1$对任意$x\in[0,1 ...

  4. 【POJ1704】Georgia and Bob(博弈论)

    [POJ1704]Georgia and Bob(博弈论) 题面 POJ Vjudge 题解 这种一列格子中移动棋子的问题一般可以看做成一个阶梯博弈. 将一个棋子向左移动时,它和前面棋子的距离变小,和 ...

  5. [poj1160][IOI2000]Post Office【动态规划】

    传送门 https://vjudge.net/problem/POJ-1160#author=SCU2018 题目描述 在一条水平的公路上建有n个小屋,两个小屋间的距离是它们的横坐标之差的绝对值.保证 ...

  6. 【原】本地仓库推送到远程仓库:fatal: refusing to merge unrelated histories

    最近,在操作git的时候,遇到各种问题,下面总结一下. 最开始,我不是先把远程仓库拉取到本地 ,而是直接在本地先创建一个仓库,再git remote add添加远程仓库. 当然,gitee官方还是有操 ...

  7. spring中的@Bean是否一定要与@Configuration一起用

        版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/little_newBee/article/details/80383691 在使用sprin ...

  8. kafka为什么这么优秀!

    kafka为什么这么优秀! 阿飞的博客 匠心零度 今天 1.动机2.持久化3.效率4.生产者4.1负载均衡4.2异步发送5.消费者Push vs. Pull消费者位置离线数据加载 1.动机 kafka ...

  9. 用 Homebrew 带飞你的 Mac

    文章目录 资料 安装 基本用法 源镜像 Homebrew也称brew,macOS下基于命令行的最强大软件包管理工具,使用Ruby语言开发.类似于CentOS的yum或者Ubuntu的apt-get,b ...

  10. ImageMagick - 智能的灰度空间(GRAYColorspace)让人窒息

    今天在处理一张 gray.jpg 图片时,发现生成的图片色彩空间是: GRAYColorspace 可我在代码中明明设置了: MagickWand * mw = NewMagickWand (); M ...