[C#]一个简易的、轻量级的方法并行执行线程辅助类
一个简易的、轻量级的方法并行执行线程辅助类 在实际应用中,经常要让多个方法并行执行以节约运行时间,线程就是必不可少的了,而多线程的管理经常又是一件头疼的事情,比如方法并行执行异步的返回问题,方法并行执行的超时问题等等,因此这里分享一个简易的、轻量级的方法并行执行线程辅助类。
线程管理辅助类的两个目标:
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#]一个简易的、轻量级的方法并行执行线程辅助类的更多相关文章
- 一个简易的 LED 数字时钟实现方法
这个应该是已经有很多人做过的东西,我应该只是算手痒,想写一下,所以,花了点时间折腾了这个,顺便把 Dark Mode 的处理也加上了. 首先可以很明确的一点,这个真没技术含量存在,只是需要点耐心. L ...
- Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习)
Androidstudio实现一个简易的加法器——分享两种方法实现(日常作业练习) ...
- 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具
查看本章节 查看作业目录 需求说明: 使用 history 对象和 location 对象中的属性和方法制作一个简易的网页浏览工具 实现思路: 使用history对象中的 forward() 方法和 ...
- jquery+flask+keras+nsfw快速搭建一个简易鉴黄工具
1. demo 地址:http://www.huchengchun.com:8127/porn_classification 接口说明: 1. http://www.huchengchun.com:8 ...
- .NET Core的文件系统[5]:扩展文件系统构建一个简易版“云盘”
FileProvider构建了一个抽象文件系统,作为它的两个具体实现,PhysicalFileProvider和EmbeddedFileProvider则分别为我们构建了一个物理文件系统和程序集内嵌文 ...
- 探秘Tomcat——一个简易的Servlet容器
即便再简陋的服务器也是服务器,今天就来循着书本的第二章来看看如何实现一个servlet容器. 背景知识 既然说到servlet容器这个名词,我们首先要了解它到底是什么. servlet 相比你或多或少 ...
- [后端人员耍前端系列]AngularJs篇:使用AngularJs打造一个简易权限系统
一.引言 上一篇博文已经向大家介绍了AngularJS核心的一些知识点,在这篇博文将介绍如何把AngularJs应用到实际项目中.本篇博文将使用AngularJS来打造一个简易的权限管理系统.下面不多 ...
- ENode 2.0 - 第一个真实案例剖析-一个简易论坛(Forum)
前言 经过不断的坚持和努力,ENode 2.0的第一个真实案例终于出来了.这个案例是一个简易的论坛,开发这个论坛的初衷是为了验证用ENode框架来开发一个真实项目的可行性.目前这个论坛在UI上是使用了 ...
- 做了一个简易的git 代码自动部署脚本
做了一个简易的git 代码自动部署脚本 http://my.oschina.net/caomenglong/blog/472665 发表于2个月前(2015-06-30 21:08) 阅读(200 ...
随机推荐
- River Problem HDU - 3947(公式建边)
River Problem Time Limit: 6000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Tot ...
- 【cf789C】Functions again(最大子序列和)
C.Functions again 题意 给你一个数组a[1..n].有一个函数\(f(l,r)=\sum_{i=l}^{r-1}\left| a[i]-a[i+1]\right| (-1)^{l-i ...
- windows7安装docker
因为本机已经安装了git,所以这里取消勾选 配置环境变量 进入到D:\DockerToolbox 将D:\DockerToolbox下的boot2docker.iso 复制到C:\Users\my\. ...
- HDU--4825 Xor Sum (字典树)
题目链接:HDU--4825 Xor Sum mmp sb字典树因为数组开的不够大一直wa 不是报的 re!!! 找了一下午bug 草 把每个数转化成二进制存字典树里面 然后尽量取与x这个位置上不相同 ...
- MessageDigest来实现数据加密
MessageDigest MessageDigest 类为应用程序提供信息摘要算法的功能,如 MD5 或 SHA 算法.信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值. M ...
- SpringBoot学习笔记(6) SpringBoot数据缓存Cache [Guava和Redis实现]
https://blog.csdn.net/a67474506/article/details/52608855 Spring定义了org.springframework.cache.CacheMan ...
- luoguP4707 重返现世
收集邮票加强版,每个邮票不是等概率获得的了. 而且是获得K个,如果把一个全集S集合找出其获得时间集合(显然获得时间两两不同)的话,那么就是第n-k+1大的期望! %%%Sooke min-max容斥扩 ...
- 解决VS2012 服务器资源管理器中的表拖不到Linq to sql中
找到C:\Program Files (x86)\Common Files\microsoft shared\Visual Database Tools\dsref80.dll 这个dll文件: 在其 ...
- 【洛谷P2585】三色二叉树
题目大意:给定一个二叉树,可以染红绿黄三种颜色,要求父节点和子节点的颜色不同,且如果一个节点有两个子节点,那么两个子节点之间的颜色也不同.求最多和最少有多少个节点会被染成绿色. 题解:加深了对二叉树的 ...
- 【POJ2230】Watchcow
题目大意:给定一个 N 个点,M 条边的无向图,要求不重复地经过每条边两次,并且从 1 号节点出发最后回到 1 号节点,求一条路径. 题解:不重复地经过两次这个操作很容易地通过无向图的建边方式来实现, ...