C#多线程等待所有子线程结束的示例
作者:Bruce- 发布时间:2021-07-02 23:04:57
标签:c#,多线程,子线程
在使用多线程过程中,可能会遇到在一些情况下必须等待子线程全部执行结束后主线程才进行下一步,
做法如下:
//在使用多线程过程中,可能会遇到在一些情况下必须等待子线程全部执行结束后主线程才进行下一步,做法如下
List<ManualResetEvent> manualEvents = new List<ManualResetEvent>();//创建线程等待集合
for (int i = 0; i < 64; i++) //WaitHandles 的数目必须少于或等于 64 个,所以最大线程数为64
{
MB m = new MB();//自定义类,用于传参
m.mre= new ManualResetEvent(false);
m.ID = i;
manualEvents.Add(m.mre);
ThreadPool.QueueUserWorkItem(ThreadMethod, m);
}
WaitHandle.WaitAll(manualEvents.ToArray());//等待所有线程结束
Console.WriteLine("Thread Finished!");
private static void ThreadMethod(object obj)
{
MB m = (MB)obj;
Thread.Sleep(1000);//等待1秒,用于模拟系统在处理事情
m.mre.Set();//将事件设置为终止状态
Console.WriteLine("Thread execute:" + m.ID);
}
以上方法在处理时当线程数超过64时报错 WaitHandles 的数目必须少于或等于 64 个,所以最大线程数为64
解决方法如下:
using (var countdown = new MutipleThreadResetEvent(list.Count))
{
for (int i = 0; i < list.Count; i++)
{
//开启N个线程,传递MutipleThreadResetEvent对象给子线程
Param p = new Param();
p.countdown = countdown;
p.Path = pa[i];
ThreadPool.QueueUserWorkItem(MyHttpRequest, p);
}
//等待所有线程执行完毕
countdown.WaitAll();
}
public class MutipleThreadResetEvent: IDisposable
{
private readonly ManualResetEvent done;
private readonly int total;
private long current;
/// <summary>
/// 构造函数
/// </summary>
/// <param name="total">需要等待执行的线程总数</param>
public MutipleThreadResetEvent(int total)
{
this.total = total;
current = total;
done = new ManualResetEvent(false);
}
/// <summary>
/// 唤醒一个等待的线程
/// </summary>
public void SetOne()
{
// Interlocked 原子操作类 ,此处将计数器减1
if (Interlocked.Decrement(ref current) == 0)
{
//当所以等待线程执行完毕时,唤醒等待的线程
done.Set();
}
}
/// <summary>
/// 等待所以线程执行完毕
/// </summary>
public void WaitAll()
{
done.WaitOne();
}
/// <summary>
/// 释放对象占用的空间
/// </summary>
public void Dispose()
{
((IDisposable)done).Dispose();
}
}
来源:https://www.cnblogs.com/xwcs/p/13508542.html


猜你喜欢
- Android横竖屏要解决的问题应该就两个:一。布局问题;二。重新载入问题。1.布局问题:如果不想让软件在横竖屏之间切换,最简单的办法就是在
- 前言Zookeeper的通过快照日志和事务日志将内存信息保存下来,记录下来每次请求的具体信息。尤其是其事务日志,每次处理事务请求时都需要将其
- 编写程序,实现顺序表的下列功能:从键盘输入数据建立一个顺序表输出该顺序表往顺序表中插入数据从顺序表中删除数据给定数据,进行查找,给出查找成功
- .NET开发人员首选的方法,通过COM组件调用Office软件本身来实现文件的创建和读写,但是数据量较大的时候异常缓慢;如下代码所示已经做了
- Java 垃圾回收与对象生命周期详解Java中的垃圾回收与对象生命周期1. 垃圾回收 垃圾回收是Java程序设计中
- 本文实例讲述了C#中timer定时器用法。分享给大家供大家参考。具体如下:下面的代码通过Timer定时器每隔1000毫秒(1秒)触发一次事件
- 一、概念:LINQ to Entities - ADO.NET | Microsoft 官方文档EF实体框架目前版本为EF6。EF6 可实现
- 写下来自己以后看:先是item的布局文件:里边放了一个图片和一个文本框<?xml version="1.0" en
- 出现此问题的原因一般都是jar包没有被扫描到;解决办法:1、在idea的设置里面如图:如果有多个jar包文件夹就都给加进来2、一般jdk版本
- public interface AttributeSet { /** * Retur
- 本次就是记录一下我的开发过程,不是教程,纯属自己做个笔记。现在项目有个需求,需要用户在公众号发送图片消息的时候,我后台程序能接收到这个图片,
- 前言WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。在 WebSocket API 中,浏
- 最近做项目中遇到ToolBar因为不同的界面toobar不同为了描述统一的风格。相信大家也非常清楚,大多数ToolBar包括以下几个方面左标
- Java 里的 * 是动态拦截 action 调用的对象,它提供了一种机制可以使开发者可以定义在一个 action 执行的前后执行的代码,也
- 线程的两种创建方式及优劣比较1、通过实现Runnable接口线程创建(1).定义一个类实现Runnable接口,重写接口中的run()方法。
- 1.情景展示java发送get请求、post请求(form表单、json数据)至另一服务器;可设置HTTP请求头部信息,可以接收服务器返回c
- 介绍该系统有三个角色,分别是:普通用户、房屋中介、管理员。普通用户的功能:浏览房屋信息、预约看房、和中介聊天、申请成为中介等等。房屋中介的功
- 本文介绍了Android:利用SharedPreferences实现自动登录,具体如下:主要代码:public class LoginAct
- 前言尺子在客户端开发中有一定的应用场景,比如厘米尺、白板的画线尺、视频剪辑的时间尺。一般可以采用用户控件通过自绘的方式实现,但今天我要讲一个
- controller传boolean形式值@GetMapping("/check-cart")public List&l