博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AutoResetEvent和ManualResetEvent用法
阅读量:7123 次
发布时间:2019-06-28

本文共 1604 字,大约阅读时间需要 5 分钟。

概述:AutoResetEvent和ManualResetEvent从字面意思来讲第一个表示的是自动重置,第二个表示手动重置,它们两都有三个方法Reset(),Set(),WaitOne()。在创建对象的时候有一个bool参数,true表示创建有信号的对象,false表示创建无信号的对象。下面来看一段代码:

 

public partial class Form1 : Form

    {

        AutoResetEvent autoResetEvent = null;

        ManualResetEvent manualResetEvent = null;

        public Form1()

        {

            Form.CheckForIllegalCrossThreadCalls = false;

 

            InitializeComponent();

            //创建对象初始化为没有信号

            this.autoResetEvent = new AutoResetEvent(false);

            //this.manualResetEvent = new ManualResetEvent(false);

            创建对象初始化为有信号

            //this.autoResetEvent = new AutoResetEvent(true);

            //this.manualResetEvent = new ManualResetEvent(true);

        }

        private void Form1_Load(object sender, EventArgs e)

        {

            //创建一线程

            Thread thread = new Thread(new ThreadStart(Method));

            thread.Start();

        }

        //定义一个线程调用的方法

        private void Method()

        {

            for (int i = 1; i <= 100;i++ )

            {

                this.label1.Text = i + "";

                //将线程堵塞,等待信号

                //this.manualResetEvent.WaitOne();

                this.autoResetEvent.WaitOne();

                Thread.Sleep(1000);

            }

        }

        private void button1_Click(object sender, EventArgs e)

        {

            this.autoResetEvent.Set();

            //this.manualResetEvent.Set();

        }

 

按照这个代码直接执行的话,我们会发现label变为1后就不变了,这是我们如果每点击一次button1那么label就变加1。说明我们没调用一次set方法后,都会自动重置,将信号关闭;如果我们将创建AutoResetEvent的参数改为true,那么说明我们在创建它的时候就给了一次信号,我运行这个程序会发现label变化两次,也就是先变为1再变为2; 如果我们将autoResetEvent注释了,将this.manualResetEvent = new ManualResetEvent(false);注释给取消,当然后面的相应的调用都需要改为manualResetEvent的的调用,这时我们来执行的时候,当程序起来后,label1变为了1,当我们点击button1的时候,label1就不停的加1,说明ManualResetEvent没有自动重置,这就是它们两最大的区别;当然如果我们还是把创建ManualResetEvent对象是的参数修改为true的话,大家想想运行会出现什么个情况呢?如果运行的话lable1就直接不停的加1。

转载于:https://www.cnblogs.com/zhangchenliang/archive/2012/08/23/2653219.html

你可能感兴趣的文章
算法 - 时间复杂度
查看>>
如何截取视频片段 批量截取片段的方法
查看>>
OKR与Scrum如何强强联手
查看>>
dva中组件的懒加载
查看>>
IOS开发错误library not found for -lXXX
查看>>
Java动态追踪技术探究
查看>>
LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
查看>>
Redis 使用记录(五)
查看>>
手挽手带你学VUE:二档 组件开发以及常用全局api
查看>>
60 个让程序员崩溃的瞬间,太TM真实了
查看>>
详解 Solidity 事件Event - 完全搞懂事件的使用
查看>>
CAS 算法 —— Compare and Swap
查看>>
js实现在input框中动态添加图标
查看>>
element-ui配合vue分页
查看>>
控制语句执行流程
查看>>
解决Error: NJS-045错误 ubuntu环境配置Nodejs访问Oracle
查看>>
利用Nginx反向代理解决跨域问题
查看>>
一个图片偶尔加载不出来的事故
查看>>
vue.js起步
查看>>
TableStore实战:DLA+SQL实时分析TableStore
查看>>