• AutoResetEvent和ManualResetEvent用法


    概述: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。

  • 相关阅读:
    SpringBook+Lombok 使用教程
    SpringBoot + Swagger Demo
    SpringBoot+Mybatis_Plus Generator
    Ubuntu下创建apt源
    Mysql优化建议
    Zabbix批量添加Hosts
    批量安装Zabbix_Agent
    CentOS7安装Zabbix
    安卓开发中的各种进度条样式
    多点触控之MotionEvent.ACTION_MASK作用
  • 原文地址:https://www.cnblogs.com/zhangchenliang/p/2653219.html
Copyright © 2020-2023  润新知