WaituntilallthreadsfinishworkinThreadPool我有这样的代码:varlist=newList();for(inti=0;i<10;i++)list.Add(i);for(inti=0;i{Console.WriteLine(x);}),list[i]);我想知道所有线程池线程何时完成工作。我怎样才能做到这一点?你需要自己跟踪它。一种选择是使用计数器和重置事件:inttoProcess=10;使用(ManualResetEventresetEvent=newManualResetEvent(false)){varlist=newList();for(inti=0;i<10;i++)列表。添加(我);for(inti=0;i<10;i++){ThreadPool.QueueUserWorkItem(newWaitCallback(x=>{Console.WriteLine(x);//安全递减计数器if(Interlocked.Decrement(reftoProcess)==0)resetEvent.Set();}),list[i]);}resetEvent.WaitOne();}//当代码到达这里时,10个线程将完成Console.WriteLine("Done");在.NETFramework4+中使用方便的System.Threading.CountdownEvent类:constintthreadCount=10;varlist=newList(threadCount);对于(vari=0;i{Console.WriteLine(x);countdownEvent.Signal();},list[i]);倒计时事件.等待();}Console.WriteLine("完成");我不确定ThreadPool是否公开了这样的函数,但是你可以使用等待句柄,顺便说一句,这两次迭代似乎没有必要:varevents=newManualResetEvent[10];varlist=new列表();对于(inti=0;i{Console.WriteLine(x);events[j].Set();},list[i]);}WaitHandle.WaitAll(事件);线程池不会告诉您线程何时完成执行,因此工作项必须自行执行我更改了如下代码:varlist=newList();ManualResetEvent[]handles=newManualResetEvent[10];对于(inti=0;i{Console.WriteLine(x);handles[(int)x].Set();}),list[i]);}WaitHandle.WaitAll(句柄);我就是这样做的。以上就是C#学习教程:等待所有线程完成ThreadPool中的工作共享。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注—classProgram{staticvoidMain(string[]args){varitems=new[]{1,2,3,4,5,6,7,8,9,10};使用(varcountdown=newCountdown(items.Length)){foreach(variteminitems){ThreadPool.QueueUserWorkItem(o=>{Thread.SpinWait(100000000);Console.WriteLine("ThreadDone!");倒计时。信号();});}倒计时。等待();}Console.WriteLine("任务完成!");控制台.ReadKey();}publicclassCountdown:IDisposable{privatereadonlyManualResetEventdone;私人只读总计;私有的volatileint当前;公共倒计时(inttotal){this.total=total;当前=总计;done=newManualResetEvent(false);}publicvoidSignal(){lock(done){if(current>0&&--current==0)完成。放();}}publicvoidWait(){done.WaitOne();}publicvoidDispose(){done.Dispose();}}}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
