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#构造函数详解

    C#构造函数详解

    本文详细讲解了C#中的构造函数,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-04-04
  • C# SQLite执行效率的优化教程

    C# SQLite执行效率的优化教程

    这篇文章主要给大家介绍了关于C# SQLite执行效率优化的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用C# SQLite具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-06-06
  • C# ManualResetEvent用法详解

    C# ManualResetEvent用法详解

    这篇文章主要介绍了C# ManualResetEvent用法详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • C# 使用匿名函数解决EventHandler参数传递的难题

    C# 使用匿名函数解决EventHandler参数传递的难题

    C#动态生成PictureBox并绑定右键菜单,实现删除图片
    2009-05-05
  • C#创建二叉搜索树的方法

    C#创建二叉搜索树的方法

    这篇文章主要介绍了C#创建二叉搜索树的方法,涉及C#二叉搜索树的实现技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#实现的AES加密解密完整实例

    C#实现的AES加密解密完整实例

    这篇文章主要介绍了C#实现的AES加密解密,结合完整实例形式分析了C#实现的AES算法进行加密与解密的相关技巧,需要的朋友可以参考下
    2016-07-07
  • Unity命令行打包WebGL的示例代码

    Unity命令行打包WebGL的示例代码

    这篇文章主要介绍了Unity命令行打包WebGL的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-02-02
  • C#实现五子棋游戏

    C#实现五子棋游戏

    这篇文章主要为大家详细介绍了C#实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-01-01
  • C#保存listbox中数据到文本文件的方法

    C#保存listbox中数据到文本文件的方法

    这篇文章主要介绍了C#保存listbox中数据到文本文件的方法,涉及C#操作listbox数据的相关技巧,需要的朋友可以参考下
    2015-04-04
  • c#源码的执行过程详解

    c#源码的执行过程详解

    在本篇文章中给大家详细讲述了c#源码的执行过程,对此有需要的朋友们可以学习下。
    2018-07-07

最新评论