栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C# > C#教程

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

C#教程 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

在使用多线程过程中,可能会遇到在一些情况下必须等待子线程全部执行结束后主线程才进行下一步,

做法如下:

 //在使用多线程过程中,可能会遇到在一些情况下必须等待子线程全部执行结束后主线程才进行下一步,做法如下
      List manualEvents = new List();//创建线程等待集合
      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;

    /// 
    /// 构造函数
    /// 
    /// 需要等待执行的线程总数
    public MutipleThreadResetEvent(int total)
    {
      this.total = total;
      current = total;
      done = new ManualResetEvent(false);
    }

    /// 
    /// 唤醒一个等待的线程
    /// 
    public void SetOne()
    {
      // Interlocked 原子操作类 ,此处将计数器减1
      if (Interlocked.Decrement(ref current) == 0)
      {
 //当所以等待线程执行完毕时,唤醒等待的线程
 done.Set();
      }
    }

    /// 
    /// 等待所以线程执行完毕
    /// 
    public void WaitAll()
    {
      done.WaitOne();
    }

    /// 
    /// 释放对象占用的空间
    /// 
    public void Dispose()
    {
      ((IDisposable)done).Dispose();
    }
  }

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

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/121629.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号