C#多线程等待所有子线程结束的示例
在使用多线程过程中,可能会遇到在一些情况下必须等待子线程全部执行结束后主线程才进行下一步,
做法如下:
//在使用多线程过程中,可能会遇到在一些情况下必须等待子线程全部执行结束后主线程才进行下一步,做法如下 ListmanualEvents=newList ();//创建线程等待集合 for(inti=0;i<64;i++)//WaitHandles的数目必须少于或等于64个,所以最大线程数为64 { MBm=newMB();//自定义类,用于传参 m.mre=newManualResetEvent(false); m.ID=i; manualEvents.Add(m.mre); ThreadPool.QueueUserWorkItem(ThreadMethod,m); } WaitHandle.WaitAll(manualEvents.ToArray());//等待所有线程结束 Console.WriteLine("ThreadFinished!");
privatestaticvoidThreadMethod(objectobj) { MBm=(MB)obj; Thread.Sleep(1000);//等待1秒,用于模拟系统在处理事情 m.mre.Set();//将事件设置为终止状态 Console.WriteLine("Threadexecute:"+m.ID); }
以上方法在处理时当线程数超过64时报错WaitHandles的数目必须少于或等于64个,所以最大线程数为64
解决方法如下:
using(varcountdown=newMutipleThreadResetEvent(list.Count)) { for(inti=0;i publicclassMutipleThreadResetEvent:IDisposable { privatereadonlyManualResetEventdone; privatereadonlyinttotal; privatelongcurrent; //////构造函数 /// ///需要等待执行的线程总数 publicMutipleThreadResetEvent(inttotal) { this.total=total; current=total; done=newManualResetEvent(false); } /// ///唤醒一个等待的线程 /// publicvoidSetOne() { //Interlocked原子操作类,此处将计数器减1 if(Interlocked.Decrement(refcurrent)==0) { //当所以等待线程执行完毕时,唤醒等待的线程 done.Set(); } } //////等待所以线程执行完毕 /// publicvoidWaitAll() { done.WaitOne(); } //////释放对象占用的空间 /// publicvoidDispose() { ((IDisposable)done).Dispose(); } }以上就是C#多线程等待所有子线程结束的示例的详细内容,更多关于c#多线程等待子线程结束的资料请关注毛票票其它相关文章!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。