C# ManualResetEvent和AutoResetEvent 使用笔记


public  class Program
{

    //1.AutoResetEvent,调用一次Set()只能继续一个阻塞线程
    //2.AutoResetEvent调用Set()后自动Reset()
    static void Main(string[] args)
    {

        Thread t = null;
        AutoResetEvent Event = new AutoResetEvent(false);

        for (int i = 0; i < 2; i++)
        {
            t = new Thread(() =>
            {

                while (true)
                {
                    //阻塞当前线程
                    Event.WaitOne();
                    Console.WriteLine("我是线程:" + Thread.CurrentThread.Name);
                    Thread.Sleep(1000);
                }

            });
            t.Name = i + "";
            t.Start();
        }
        //5秒后允许一个等待的线程继续。当前允许的是线程1
        Thread.Sleep(5000);
        Event.Set();

        //5秒后允许一个等待的线程继续。当前允许的是线程2
        Thread.Sleep(5000);
        Event.Set();

        //PS:如果使用AutoResetEvent的WaitOne()将5个线程阻塞,则需要调用5次Set()才能恢复5;如果再次阻塞时,不需要手动调用Reset();
        Console.ReadLine();

    }


    //1.ManualResetEvent,调用一次Set()允许继续全部阻塞线程,这是和AutoResetEvent的区别
    //2.ManualResetEvent调用Set()后需要手动Reset(),将信号 设置为非终止状态,只有非终止状态线程中调用WaitOne()才能导所在的致线程阻止。
    static void Main2(string[] args)
    {

        Thread t = null;
        //初始化非终止状态,WaitOne()可以直接阻塞所在的线程
        ManualResetEvent Event = new ManualResetEvent(false);

        for (int i = 0; i < 2; i++)
        {
            t = new Thread(() =>
            {

                while (true)
                {
                    //设置非终止状态,因为终止状态下调用Reset()不会阻塞当前线程
                    Event.Reset();
                    //阻塞当前线程
                    Event.WaitOne();
                    Console.WriteLine("我是线程:" + Thread.CurrentThread.Name);
                    Thread.Sleep(1000);
                }

            });
            t.Name = i + "";
            t.Start();
        }
        //5秒后允许所有阻塞的线程继续。
        Thread.Sleep(5000);
        Event.Set();

        //PS:如果使用ManualResetEvent将5个线程阻塞,则需要调用1次Set(),将允许所有阻塞的线程继续执行;如果再次阻塞时,则需要手动调用Reset();
        Console.ReadLine();

    }
}

知识共享许可协议
《C# ManualResetEvent和AutoResetEvent 使用笔记》 常伟华 创作。
本作品采用知识共享署名-相同方式共享 4.0 国际许可协议 | 3.0 中国大陆许可协议进行许可。

站内公告

A PHP Error was encountered

Severity: Core Warning

Message: PHP Startup: zip: Unable to initialize module Module compiled with module API=20060613 PHP compiled with module API=20090626 These options need to match

Filename: Unknown

Line Number: 0

Backtrace: