【CSharp 学习笔记】关于ManualResetEvent的用法

关于ManualResetEvent

Thread包中的类,多用于多线程协同和进程操作。

  • 常用方法:Set()、ReSet()、WaitOne()
  • Set() : 用于向 ManualResetEvent 发送信号,使其取消阻塞状态(唤醒进程)或者开始阻塞进程,这基于 ManualResetEvent 的初始状态。
  • ReSet() : 将 ManualResetEvent 的状态重置至初始状态(即使用 Set() 方法之前的状态)。
  • WaitOne() : 使 ManualResetEvent 进入阻塞状态,开始等待唤醒信号。如果有信号,则不会阻塞,直接通过。
  • 信号 : 当 new ManualResetEvent(bool arg) 时,arg参数就是信号状态,假如为false,则表示当前无信号,如果为true,则有信号。

关于ManualResetEvent的实践

——能够返回数据的MessageBox实现

Form1.cs

/**************************
* 创建时间 : 2017/7/17 10:21:25
* 作    者 : Juer Genie(Wang) 
* 类    名 : Form1
* 项目名称 : Project1
* CLR版 本 : 4.0.30319.42000
***************************/
using System;
using System.Threading;
using System.Windows.Forms;

namespace Project1
{
    public partial class Form1 : Form
    {
        //返回值,默认为Empty
        static string value = string.Empty;
        //默认为false - 无信号(阻塞)
        static ManualResetEvent mre = new ManualResetEvent(false);

        //自定义MessageBox
        public Form1()
        {
            //Button1 - Text = "YES!"
            //Button2 - Text = "NO!"
            InitializeComponent();
        }
        //入口方法
        internal static string GetButtom()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());

            //让mre开始阻塞进程,等待信号
            mre.WaitOne();

            return value;
        }

        private void button1_Click(object sender, EventArgs e)
        {
            value = "YES!";
            this.Close();
            //向mre发送信号
            mre.Set();
        }

        private void button2_Click(object sender, EventArgs e)
        {
            value = "NO!";
            this.Close();
            //向mre发送信号
            mre.Set();
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if(value == string.Empty) value = "CLOSE!";
            //向mre发送信号
            mre.Set();
        }
    }
}

Program.cs

using System;

namespace Project1
{
    class Program
    {
        public Program()
        {

        }
        public static void Main(string[] args)
        {
            Console.WriteLine("Now open the MessageBox...");
            Console.Write("You click the button : " + Form1.GetButtom());
            Console.ReadKey();
        }
    }
}

笔记 :

ManualResetEvent对象的核心方法有三个 : Set(), ReSet(), WaitOne(), 这三个方法的搭配使用能够满足许多需求,如多线程之间的协同调度等。
通过WaitOne()方法产生阻塞,然后在适当的时候使用Set()发送信号取消阻塞,唤醒进程。

之前在思考该怎么使进程阻塞,一直到获取用户的输入数据为止——没错,我在想Console的ReadLine方法到底是什么原理。
在网上搜索了一番之后,将目光放在了ManualResetEvent和AutoResetEvent上,这两个对象的效果和我期望的一样,不过我还是不怎么了解这两个对象之间的区别。


这是我的第一篇博客,我还有很多需要学习的东西——努力吧,骚年。
今后我会不时的将学习过程中的一些知识或者容易出现的问题记录下来。
CSDN,我来了>v>。

很高兴在CSDN看到了Markdown编辑器,这是我最喜欢的标记语言了,排版效果好的不行。然后果然在教程下方看到了Markdown蛋疼的制表格式——想画表?那就画吧。

你可能感兴趣的:(CSharp,学习笔记)