usingSystem;usingSystem.Threading;namespaceconsoleapplication1{classProgram {Private Staticautoresetevent[] events; Static voidMain (string[] args) { intThreadnum =Ten; thread[] Thread=NewThread[threadnum]; Events=NewAutoresetevent[threadnum]; for(inti =0; i < threadnum; i++) { varWaithandler =NewAutoResetEvent (false); Events[i]=Waithandler; ThreadStart Starter=Delegate { varparam =Newtuple<string, Autoresetevent> ("Test Print:"+I, Waithandler); Print (param); }; Thread[i]=NewThread (starter) {Name="Thread"+i.tostring ()}; } for(inti =0; i < threadnum; i++) {Thread[i]. Start (); } waithandle.waitall (events); Console.WriteLine ("completed!"); Console.read (); } Private Static voidPrint (Objectparam) { varp = (tuple<string, autoresetevent>) param; Console.WriteLine (Thread.CurrentThread.Name+": begin!"); Console.WriteLine (Thread.CurrentThread.Name+": Print"+p.item1); Thread.Sleep ( -); Console.WriteLine (Thread.CurrentThread.Name+": end!"); P.item2.set (); } }}
Once set, actually using ManualResetEvent is enough.
usingSystem;usingSystem.Collections.Generic;usingSystem.Threading;namespaceconsoleapplication1{classProgram {Static voidMain (string[] args) { varWaits =NewList<eventwaithandle>(); for(inti =0; I <Ten; i++) { varHandler =NewManualResetEvent (false); Waits. ADD (handler); NewThread (NewParameterizedthreadstart (Print)) {Name="Thread"+i.tostring ()}. Start (Newtuple<string, Eventwaithandle> ("Test Print:"+I, handler)); } waithandle.waitall (Waits. ToArray ()); Console.WriteLine ("completed!"); Console.read (); } Private Static voidPrint (Objectparam) { varp = (tuple<string, eventwaithandle>) param; Console.WriteLine (Thread.CurrentThread.Name+": begin!"); Console.WriteLine (Thread.CurrentThread.Name+": Print"+p.item1); Thread.Sleep ( -); Console.WriteLine (Thread.CurrentThread.Name+": end!"); P.item2.set (); } }}
Go C # Multi-threaded waiting for all threads to end an issue