1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
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();
}
}
}
|
Once set, actually using ManualResetEvent is enough.
1234567891011121314151617181920212223242526272829303132333435363738 |
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();
}
}
}
|
From for notes (Wiz)
C # Multi-threaded waiting for all threads to end an issue