C#多线程之ManualResetEvent

上一篇 / 下一篇  2014-01-17 11:09:25 / 个人分类:C#

        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();
    }
}
    运行上述代码后,结果如下图所示(结果是随机的哦)~:



TAG:

 

评分:0

我来说两句

Open Toolbar