C#多线程等待所有子线程结束的示例

 更新时间:2020年12月04日 09:58:24   作者:Bruce-  
这篇文章主要介绍了C#多线程等待所有子线程结束的示例,帮助大家更好的理解和学习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();
    }
  }

以上就是C#多线程等待所有子线程结束的示例的详细内容,更多关于c# 多线程等待子线程结束的资料请关注脚本之家其它相关文章!

相关文章

  • C#使用winform简单导出Excel的方法

    C#使用winform简单导出Excel的方法

    这篇文章主要介绍了C#使用winform简单导出Excel的方法,结合实例形式分析了WinForm操作Excel文件的写入导出等相关技巧,需要的朋友可以参考下
    2016-06-06
  • C#中查找Dictionary中的重复值的方法

    C#中查找Dictionary中的重复值的方法

    这篇文章主要介绍了C#中查找Dictionary中的重复值的方法,需要的朋友可以参考下
    2015-09-09
  • c#利用system.net发送html格式邮件

    c#利用system.net发送html格式邮件

    这篇文章主要介绍了c#利用system.net发送html格式邮件的示例,带有抄送、密送、附件功能,需要的朋友可以参考下
    2014-02-02
  • C#中使用UDP通信实例

    C#中使用UDP通信实例

    这篇文章主要介绍了C#中使用UDP通信实例,非常实用的技巧,需要的朋友可以参考下
    2014-08-08
  • c# 用ICSharpCode组件压缩文件

    c# 用ICSharpCode组件压缩文件

    今天,主要总结下,windows平台下,zip的压缩与解压的方法,用ICSharpCode组件,有此需求的朋友可以参考下本文
    2021-06-06
  • VS2019属性管理器没有Microsoft.Cpp.x64.user的解决办法

    VS2019属性管理器没有Microsoft.Cpp.x64.user的解决办法

    这篇文章主要介绍了VS2019属性管理器没有Microsoft.Cpp.x64.user的解决办法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • C#检查远程或本地磁盘使用率

    C#检查远程或本地磁盘使用率

    要检查磁盘的使用情况确定程序放哪个服务器和清理垃圾,所以写个小程序帮忙检查。本文给大家介绍C#检查远程或本地磁盘使用率的相关知识,感兴趣的朋友一起学习吧
    2016-04-04
  • c#实现摄像头拍照功能示例

    c#实现摄像头拍照功能示例

    这篇文章主要介绍了c#实现摄像头拍照功能示例,需要的朋友可以参考下
    2014-04-04
  • C#使用Enum.TryParse()实现枚举安全转换

    C#使用Enum.TryParse()实现枚举安全转换

    这篇文章介绍了C#使用Enum.TryParse()实现枚举安全转换的方法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • C#语音识别用法实例

    C#语音识别用法实例

    这篇文章主要介绍了C#语音识别用法,实例分析了C#利用微软操作系统自动的语音识别功能,读取信息的技巧,需要的朋友可以参考下
    2015-01-01

最新评论