C#多线程的方法有很多种,大多普遍都会用new Thread的方法(至少本人是这样的)。说说怎么会引出ManualResetEvent的吧。在多线程代码中,本人一直在想有什么好方法来确定各线程是否运行完毕。一般提及这个,第一想到的就是定义一个全局布尔变量来控制和判断,但总觉得不是很专业。一个机遇让本人碰到了ManualResetEvent来解决这个问题。
通过ManualResetEvent的构造函数,传递布尔值来进行初始化。如果初始状态为终止状态,则设置true;如果为非终止状态,则设置false(终止状态是指该线程的所有活动都运行完毕,可以被终止)。一旦状态被终止了,ManualResetEvent将保持其终止状态,除非被Reset,此时通过调用WaitOne()能获得该线程的状态。Set()方法是将非终止状态变为终止状态,Reset()方法是将终止状态变为非终止状态。 实例如下:
using System.Threading;
public CTest
{
ManualResetEvent[] mre;
public void Main()
{
// 创建4个线程
int nThreadCount = 4;
mre = new ManualResetEvent[nThreadCount];
int i = 0;
for (i = 0; i < nThreadCount; i++)
{
// 将各线程状态初始化为非终止状态
mre[i] = new ManualResetEvent(false);
}
Thread[] threads = new Thread[nThreadCount];
for (i = 0; i < nThreadCount; i++)
{
// 依次创建线程
threads[i] = new Thread(new ThreadStart(SubThread));
// 给线程一个编号
threads[i].Name = i.ToString();
}
// 运行各线程
foreach (Thread t in threads)
{
t.Start();
}
Thread.Sleep(2000);
Console.WriteLine("This is the main thread.");
// 检测各线程是否都终止了,最长check时间为1分钟
for (i = 0; i < nThreadCount; i++)
{
mre[i].WaitOne(new TimeSpan(0, 1, 0));
}
// 强制kill掉还alive的线程
for (i = 0; i < nThreadCount; i++)
{
if (threads[i].IsAlive)
{
threads[i].Abort();
}
}
}
public void SubThread()
{
string strID = Thread.CurrentThread.Name;
int nID = Convert.ToInt32(strID);
// 产生一个随机数
Random r = new Random();
Thread.Sleep(500 * r.Next(1, 8));
Console.WriteLine("This thread ID is: " + strID +
" and it is running 1.\n");
Thread.Sleep(500 * r.Next(5));
Console.WriteLine("This thread ID is: " + strID +
" and it is running 2.\n");
// 置为终止状态
mre[nID].Set();
}
}
运行上述代码后,结果如下图所示(结果是随机的哦)~: