[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 ...
随机推荐
- 【XSY2665】没有上司的舞会 LCT DP
题目大意 有一棵树,最开始只有一个点.每次会往这棵树中加一个点,总共\(n\)次.输出每次加点后树的最大独立集大小. 强制在线. \(n\leq 300000\) 题解 显然是LCT. 那么要维护什么 ...
- git 出现stderr: error: bad signature fatal: index file corrupt
命令执行依次: $ rm -f .git/index $ git reset 重启即可
- [NOIp2008] 双栈排序 (二分图染色 + 贪心)
题意 给你一个长为 \(n\) 的序列 \(p\) ,问是否能够通过对于两个栈进行 push, pop(print) 操作使得最后输出序列单调递增(即为 \(1 \cdots n\) ),如果无解输出 ...
- iptable四表五链
链(内置): PREROUTING:对数据包作路由选择前应用此链中的规则: INPUT:进来的数据包应用此规则链中的策略: FORWARD:转发数据包时应用此规则链中的策略: OUTPUT:外出的数据 ...
- 【BZOJ4832】抵制克苏恩(矩阵快速幂,动态规划)
[BZOJ4832]抵制克苏恩(矩阵快速幂,动态规划) 题面 BZOJ 题解 一模一样 #include<iostream> #include<cstdio> using na ...
- Redhat 用代理连外网
设置 /etc/yum.conf 添加proxy=http://web-proxy.corp.xx.com:8080 /etc/yum.repos.d/rhel-source.repo 里面改成ena ...
- 分考场(无向图着色问题)(dfs回溯)
问题描述 n个人参加某项特殊考试. 为了公平,要求任何两个认识的人不能分在同一个考场. 求是少需要分几个考场才能满足条件. 输入格式 第一行,一个整数n(1<n<100),表示参加考试的人 ...
- HDU--5519 Sequence II (主席树)
题目链接 2016年长春ccpc I 题 题目大意 : 给你n(n≤2∗105n≤2∗105)个数,每个数的大小 0<Ai≤2∗10^5 0<Ai≤2∗10^5. 再给你m(m≤2∗1 ...
- js 表单提交
方式一: 使用input type="submit" 提交 <form action="http://www.w3school.com.cn/tiy/loadtex ...
- Linux基本命令总结(二)
接上篇: 7,cp命令用来复制文件或者目录,是Linux系统中最常用的命令之一.一般情况下,shell会设置一个别名,在命令行下复制文件时,如果目标文件已经存在,就会询问是否覆盖,不管你是否使用-i参 ...