ManualResetEven使用的最清楚说明

快速阅读

理解ManualResetEvent,以及如何使用。

官方说明

官方介绍:https://docs.microsoft.com/en-us/dotnet/api/system.threading.manualresetevent?view=netframework-1.1

一个线程同步事件 ,通过发信号来控制线程来控制 是否有权限访问 资源

构造函数

初始化实例,并且指明信号的初始状态 。

private static ManualResetEvent mre = new ManualResetEvent(false);

true:表示线程可以访问资源 ,就是可以无视waitone里的等待

false:表示线程如果碰到waitone的时候 ,就要暂停,等主线程来控制 。

比如如下demo中,主线程调用线程执行以下方法时,如果默认是false,则只会输入***starts and calls mre.WaitOne() 而没有 ___ends的输出,因为默认是false ,线程中的waitone()会阻止线程的继续访问 。

private static void ThreadProc()
{
string name = Thread.CurrentThread.Name; Console.WriteLine(name + " starts and calls mre.WaitOne()"); mre.WaitOne(); Console.WriteLine(name + " ends.");
}

Set()方法

将事件状态设置为“已发送信号”,允许被waitone() 阻止的一个或者多个线程进行执行线程中的代码。

这个上面的demo中就会在调用mre.set()方法执行之后,会继续调用线程中的下面的___ends 的输出。

Reset()方法

将事件状态设置为“没信号”,这样线程中执行waitone()的时候 ,就会阴止当前线程的执行。实现了和构造函数传入默认值false一样的效果,不过它可以在执行的过程中,进行重新设置,表求又把线程调用组止了。

直接再次接收到set方法 。才会再次执行下面的访问 。

官方的demo

private static ManualResetEvent mre = new ManualResetEvent(false);

static void Main(string[] args)
{
Console.WriteLine("\nStart 3 named threads that block on a ManualResetEvent:\n"); for (int i = 0; i <= 2; i++)
{
Thread t = new Thread(ThreadProc);
t.Name = "Thread_" + i;
t.Start();
} Thread.Sleep(500);
Console.WriteLine("\nWhen all three threads have started, press Enter to call Set()" +
"\nto release all the threads.\n");
Console.ReadLine(); mre.Set(); Thread.Sleep(500);
Console.WriteLine("\nWhen a ManualResetEvent is signaled, threads that call WaitOne()" +
"\ndo not block. Press Enter to show this.\n");
Console.ReadLine(); for (int i = 3; i <= 4; i++)
{
Thread t = new Thread(ThreadProc);
t.Name = "Thread_" + i;
t.Start();
} Thread.Sleep(500);
Console.WriteLine("\nPress Enter to call Reset(), so that threads once again block" +
"\nwhen they call WaitOne().\n");
Console.ReadLine(); mre.Reset(); // Start a thread that waits on the ManualResetEvent.
Thread t5 = new Thread(ThreadProc);
t5.Name = "Thread_5";
t5.Start(); Thread.Sleep(500);
Console.WriteLine("\nPress Enter to call Set() and conclude the demo.");
Console.ReadLine(); mre.Set();
} private static void ThreadProc()
{
string name = Thread.CurrentThread.Name; Console.WriteLine(name + " starts and calls mre.WaitOne()"); mre.WaitOne(); Console.WriteLine(name + " ends.");
}

运行结果

友情提示

​ 我对我的文章负责,发现好多网上的文章 没有实践,都发出来的,让人走很多弯路,如果你在我的文章中遇到无法实现,或者无法走通的问题。可以直接在公众号《爱码农爱生活 》留言。必定会再次复查原因。让每一篇 文章的流程都能顺利实现。

最新文章

  1. HDU 5596(更新,两种方法)
  2. Swift 遇到的报错信息
  3. UITableView中cell的圆角(第一个和最后一个)
  4. SQL 去除小数点后无效 0 的方法
  5. [裸KMP][HDU1711][Number Sequence]
  6. django 创建admin用户名跟密码
  7. 获取Promise的值
  8. C++ OpenMp的并行编程
  9. Django框架详细介绍---ORM---图书信息系统专题训练
  10. c#代码阅读
  11. UVA756 Biorhythms
  12. Initialization of bean failed; nested exception is org.springframework.beans.InvalidPropertyException: Invalid property &#39;dataSource&#39; of bean class [com.liuyang.jdbc.PersonDao]: No property &#39;dataSource
  13. Appium+python HTML测试报告(2)——一份报告模板(转)
  14. scala flatMap reduceLeft foldLeft
  15. Python基本序列-字典
  16. 【DB2】在使用EXISTS时,查询结果中包含聚合函数,一个不注意就会犯错的坑
  17. Android内存优化(二)DVM和ART的GC日志分析
  18. .db轻量级本地数据库
  19. Spring课程 Spring入门篇 4-5 Spring bean装配之基于java的容器注解说明--@Bean
  20. Composer的Autoload源码实现2——注册与运行

热门文章

  1. springboot实现读写分离(基于Mybatis,mysql)
  2. thinkPHP中session()方法用法详解
  3. Vue项目中使用svg图标
  4. tcpdump截帧工具使用
  5. 关于C++模板不能分离编译的问题思考
  6. 【转】使用JavaParser获得Java代码中的类名、方法形参列表中的参数名以及统计总的文件个数与不能解析的文件个数
  7. Java精通并发-自旋对于synchronized关键字的底层意义与价值分析以及互斥锁属性详解与Monitor对象特性解说【纯理论】
  8. 收起.NET程序的dll来
  9. Nmap扫描工具实验报告
  10. HDU - 6125: Free from square (状压DP+分组背包)