AutoResetEvent和ManualResetEvent

本文在于巩固基础

AutoResetEvent

概念:通知正在等待的线程已发生的事件

如果AutoResetEvent 为非终止状态,则线程会被阻止,并等待当前控制资源的线程通过调用 Set 来通知资源可用。 调用Set 向AutoResetEvent 发信号以释放等待线程。

可以通过构造函数设置事件状态 false为非终止,true为终止

常用方法:

Set();将事件状态设置为终止状态,允许一个或多个等待线程继续。

ReSet();将事件状态设置为非终止状态,导致线程阻止

WaitOne();阻止当前线程,直到当前 WaitHandle 收到信号。

ManualResetEvent用法差不多,有一点差别,在下面可以看到

下面通过一个简单实例来演示这个基本用法

 

class Program
    {
        //设置事件状态为非终止
        
        private static ManualResetEvent _manualResetEvent=new ManualResetEvent(false);
        private static Thread _thread = new Thread(new ThreadStart(ThreadMethod));
        private static int _count = 0;
        static void Main(string[] args)
        {
            _thread.Start();
            Console.ReadLine();
            _manualResetEvent.Set();// 通知等待线程继续


        }

        private static void ThreadMethod()
        {
            while (true)
            {
                _manualResetEvent.WaitOne();//由于上面设置事件状态为非终止所以下面语句不会执行,除非收到可以继续的信号
                Thread.Sleep(1000);
                Console.WriteLine(_count++);


            }
        }

 

一开始不会有输出,直到你输入数据后线程才会继续

结果如下

W
0
1
2
3
4
5
6
7
8

...

 注意这里AntoResetEvent中的WaitOne方法会切换信号(不怎么专业,明白就好),也就是,这次是收到信号,下次就变成无信号,再执行又有信号,如此往复

下面是AntoResetEvent实现

 class Program
    {
        //设置事件状态为非终止
        
        private static AutoResetEvent _autoResetEvent=new AutoResetEvent(false);
        private static Thread _thread = new Thread(new ThreadStart(ThreadMethod));
        private static int _count = 0;
        static void Main(string[] args)
        {
            _thread.Start();
            Console.ReadLine();
            _autoResetEvent.Set();


        }

        private static void ThreadMethod()
        {
            while (true)
            {
                _autoResetEvent.WaitOne();//由于上面设置事件状态为非终止所以下面语句不会执行,除非收到可以继续的信号
                Thread.Sleep(1000);
                Console.WriteLine(_count++);
                _autoResetEvent.Set();//上面的WaitOne执行后变为无信号,这样下次循环就阻塞了,这步可以使下次循环接收到继续的信号


            }
        }


    }

 

 

 

 

转载于:https://www.cnblogs.com/jixinyu/p/4308670.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值