[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 ...
随机推荐
- 【BZOJ5119】【CTT2017】生成树计数 DP 分治FFT 斯特林数
CTT=清华集训 题目大意 有\(n\)个点,点权为\(a_i\),你要连接一条边,使该图变成一颗树. 对于一种连边方案\(T\),设第\(i\)个点的度数为\(d_i\),那么这棵树的价值为: \[ ...
- bzoj 1257: [CQOI2007]余数之和 (数学+分块)
Description 给出正整数n和k,计算j(n, k)=k mod 1 + k mod 2 + k mod 3 + … + k mod n的值 其中k mod i表示k除以i的余数. 例如j(5 ...
- MT【251】椭圆中的好题
已知直线$l:x+y-\sqrt{3}=0$过椭圆$E:\dfrac{x^2}{a^2}+\dfrac{y^2}{b^2}=1,(a>b>0)$的右焦点且与椭圆$E$交于$A,B$两点,$ ...
- 【165223&165218】结对感想——论如何与队友完美配合
★ 为什么要结对编程? 一.结对编程的优势 搭档的形式 平等.互补 高效率.共分享 相互影响.督促学习 方便复审与反馈 二.结对编程的方式 互换的角色 相同的目的 结对编程中有两个角色: (a)驾驶员 ...
- sscanf、sprintf、stringstream常见用法
转载自:https://blog.csdn.net/jllongbell/article/details/79092891 前言: 以前没有接触过stringstream这个类的时候,常用的字符串和数 ...
- ACM-ICPC 2018 南京赛区网络预赛 L题(分层最短路)
题目链接:https://nanti.jisuanke.com/t/31001 题目大意:给出一个含有n个点m条边的带权有向图,求1号顶点到n号顶点的最短路,可以使<=k条任意边的权值变为0. ...
- TimerTask的run()方法里面如何调用service层里面的方法
在java的spring框架中,用Timer和TimerTask来实现定时任务,有时我们要在TimerTask的子类的重写run方法里,调用service层的方法. 但是不管是spring.xml配置 ...
- js 判断 是否在当前页面 当前页面是否在前端
1.使用visibilitychange 浏览器标签页被隐藏或显示的时候会触发visibilitychange事件. document.addEventListener("visibilit ...
- empty() 与 html("") 的区别
empty,首先循环给后代元素移除绑定.清除jquery给此dom的cache,然后循环removeFirstChild. 而html(''),则是简单暴力的设置innerHTML = ''; 查看文 ...
- 洛谷P4390 Mokia CDQ分治
喜闻乐见的CDQ分治被我搞的又WA又T..... 大致思路是这样的:把询问用二维前缀和的思想拆成4个子询问.然后施CDQ大法即可. 我却灵光一闪:树状数组是可以求区间和的,那么我们只拆成两个子询问不就 ...