【CSharp 学习笔记】关于ManualResetEvent的用法
来源:互联网 发布:淘宝平铺拍摄布光 编辑:程序博客网 时间:2024/05/18 21:06
关于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蛋疼的制表格式——想画表?那就画吧。
阅读全文
0 0
- 【CSharp 学习笔记】关于ManualResetEvent的用法
- 【CSharp 学习笔记】关于路径的一些小笔记
- 【CSharp 学习笔记】关于ini文件的操作
- ManualResetEvent类的用法
- C# ManualResetEvent 类的用法
- 【CSharp 学习笔记】关于使用字符串作为索引值的索引器
- ManualResetEvent用法
- ManualResetEvent用法
- ManualResetEvent用法
- C#的ManualResetEvent在多线程中的用法
- csharp学习笔记--Grid篇
- CSharp学习笔记之八 文件的读写
- CSharp学习笔记之十 类的修饰符
- 《csharp高级编程》 学习笔记 第二章 csharp基础
- AutoResetEvent和ManualResetEvent用法
- 线程同步- EventWaitHandle类的子类ManualResetEvent的用法
- CSharp学习笔记之一 C#中的类型
- CSharp学习笔记之五 结构
- Linux系统同步时间
- day03学习代码
- 解决SpringMvc前台传Date类型到后台报400错误问题
- 树的性质
- PowerDesigner教程系列
- 【CSharp 学习笔记】关于ManualResetEvent的用法
- 小程序网络访问的封装
- springMVC的数据绑定
- 学习springmvc的第十四天(controller返回json)
- day03作业代码 自己写的还有老师讲的 还有参考别人的
- 切比雪夫距离(bzoj 3210: 花神的浇花集会)
- Python 案例001 (有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数)
- Mybatis+springMVC下事务控制的配置
- 声明集成Thread类的奇数/偶数序列线程