1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | using System; using System.Threading; namespace ConsoleApplication1 { class Program { private static AutoResetEvent[] events; static void Main( string [] args) { int threadNum = 10; Thread[] thread = new Thread[threadNum]; events = new AutoResetEvent[threadNum]; for ( int i = 0; i < threadNum; i++) { var waithandler = new AutoResetEvent( false ); events[i] = waithandler; ThreadStart starter = delegate { var param = new Tuple< string , AutoResetEvent>( "test print:" + i, waithandler); Print(param); }; thread[i] = new Thread(starter) { Name = "thread" + i.ToString() }; } for ( int i = 0; i < threadNum; i++) { thread[i].Start(); } WaitHandle.WaitAll(events); Console.WriteLine( "Completed!" ); Console.Read(); } private static void Print( object param) { var p = (Tuple< string , AutoResetEvent>)param; Console.WriteLine(Thread.CurrentThread.Name + ": Begin!" ); Console.WriteLine(Thread.CurrentThread.Name + ": Print" + p.Item1); Thread.Sleep(300); Console.WriteLine(Thread.CurrentThread.Name + ": End!" ); p.Item2.Set(); } } } |
一次性地Set,其实使用ManualResetEvent就足够了。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 | using System; using System.Collections.Generic; using System.Threading; namespace ConsoleApplication1 { class Program { static void Main( string [] args) { var waits = new List<EventWaitHandle>(); for ( int i = 0; i < 10; i++) { var handler = new ManualResetEvent( false ); waits.Add(handler); new Thread( new ParameterizedThreadStart(Print)) { Name = "thread" + i.ToString() }.Start( new Tuple< string , EventWaitHandle>( "test print:" + i, handler)); } WaitHandle.WaitAll(waits.ToArray()); Console.WriteLine( "Completed!" ); Console.Read(); } private static void Print( object param) { var p = (Tuple< string , EventWaitHandle>)param; Console.WriteLine(Thread.CurrentThread.Name + ": Begin!" ); Console.WriteLine(Thread.CurrentThread.Name + ": Print" + p.Item1); Thread.Sleep(300); Console.WriteLine(Thread.CurrentThread.Name + ": End!" ); p.Item2.Set(); } } } |