zoukankan      html  css  js  c++  java
  • 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。

  • 相关阅读:
    Eclipse中输入系统变量和运行参数
    poi大数据导入解决方法
    技术走向管理一些思考(2)-建立管理思维
    C. Diverse Permutation(Codeforces Round #275(div2)
    mysql大数据高并发处理
    UVa 11849
    centos7;windows下安装和使用spice
    HDU-4819-Mosaic(二维线段树)
    Using a Plugin
    CSU1608: Particle Collider(后缀数组)
  • 原文地址:https://www.cnblogs.com/zhangchenliang/p/2653219.html
Copyright © 2011-2022 走看看