[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 ...
随机推荐
- 在 CentOS 上编写 init.d service script [转]
背景:之前编写了一些脚本,下载了一些开源软件,想把它们做成系统服务,通过 service your_prog_name start 这样的方式来后台运行,并在开机时自动启动.在了解了 daemon 命 ...
- python3 字典dict
字典是用大括号{}表示 dict() 键必须是唯一的,但值则不必:键是不可变的,如字符串.数字.元组,值可以取任意数据类型: 可以迭代, del可以删除一对键值,del Dict['key'] 重复给 ...
- 构建SSH服务
什么是SSH?简单说,SSH是一种网络协议,用于计算机之间的加密登录.如果一个用户从本地计算机,使用SSH协议登录另一台远程计算机,我们就可以认为,这种登录是安全的,即使被中途截获,密码也不会泄露.最 ...
- python中无法被转化为set的list[list组成的list]
arr = [[a],[b]] set(arr) output: Traceback (most recent call last): File "<stdin>", ...
- centos7系统安装完成后一些基本的优化
安装完centos7.3后,做一些基本的操作 基本操作一:主机名 centos7有一个新的修改主机名的命令hostnamectl # hostnamectl set-hostname --static ...
- python学习day7 深浅拷贝&文件操作
4-4 day07 深浅拷贝&文件操作 .get()用法 返回指定键的值,如果值不在字典中返回默认值. info={'k1':'v1,'K2':'v2'}mes = info.get('k1' ...
- JVM内存模型你只要看这一篇就够了
JVM内存模型你只要看这一篇就够了 我是一只孤傲的鱼鹰 让我们不厌其烦的从内存模型开始说起:作为一般人需要了解到的,JVM的内存区域可以被分为:线程栈,堆,静态方法区(实际上还有更多功能的区域,并且这 ...
- 200行Go代码实现自己的区块链——区块生成与网络通信
go启动后,可以用telnet登录访问. 注意端口配置写在.env里面. 源码:https://github.com/mycoralhealth/blockchain-tutorial/tree/ma ...
- 洛谷T31039 九尾狐吃棉花糖
小伙伴出的题. 一眼看出是状压DP裸题.回忆poj2288 islands and bridges,然后就很好写了. 啪啪啪打了个状压DP出来(晚上寝室写的,其实是记忆化搜索),发现sum总是INF ...
- [Splay][学习笔记]
胡扯 因为先学习的treap,而splay与treap中有许多共性,所以会有很多地方不会讲的很细致.关于treap和平衡树可以参考这篇博客 关于splay splay,又叫伸展树,是一种二叉排序树,它 ...