c# ManualResetEventSlim
前言
后续会把异步编程的ManualResetEventSlim 深入写完,先简单介绍一下吧。
ManualResetEventSlim 有set 方法和 reset 、wait、dispose方法。
ManualResetEventSlim wait 方法 阻止当前线程,直到设置了当前 ManualResetEventSlim 为止。
看上图,一个ManualResetEventSlim 可以去给多个线程增加锁。
他的set 和 reset 就是控制锁的打开和关闭。
这样解释可能不太理解哈,看下代码。
正文
代码:
static ManualResetEventSlim _mainEvent = new ManualResetEventSlim();
static void Main(string[] args)
{
var t1 = new Thread(() => TravelThrougnGates("Thead 1", 5));
var t2 = new Thread(() => TravelThrougnGates("Thead 2", 6));
var t3 = new Thread(() => TravelThrougnGates("Thead 3", 12));
t1.Start();
t2.Start();
t3.Start();
Thread.Sleep(TimeSpan.FromSeconds(6));
_mainEvent.Set();
Thread.Sleep(TimeSpan.FromSeconds(2));
_mainEvent.Reset();
Console.WriteLine($"_mainEvent is not open");
Thread.Sleep(TimeSpan.FromSeconds(10));
Console.WriteLine($"_mainEvent is open");
_mainEvent.Set();
Thread.Sleep(TimeSpan.FromSeconds(2));
Console.WriteLine($"_main enter");
}
static void TravelThrougnGates(string Threadname, int second)
{
Console.WriteLine($"{Threadname} start sleep");
Thread.Sleep(TimeSpan.FromSeconds(second));
Console.WriteLine($"{Threadname} start running");
_mainEvent.Wait();
Console.WriteLine($"{Threadname} enter gate");
}
运行一下,断点位置为:第一个:_mainEvent.Set();
看下结果:
也就是说6秒了,但是Thead 1 和 Thead 2 依然没有执行完毕,说明线程被阻塞了。
然后断点为:_mainEvent.Reset(); 阻塞了:Thead 3。
执行完毕了Thead 1 和 Thead 2
然后_mainEvent.Reset();又关闭了,然后阻塞了。
后续
补齐原理。
c# ManualResetEventSlim的更多相关文章
- C#并行编程 (Barrier,CountdownEvent,ManualResetEventSlim,SemaphoreSlim,SpinLock,SpinWait )
背景 有时候必须访问变量.实例.方法.属性或者结构体,而这些并没有准备好用于并发访问,或者有时候需要执行部分代码,而这些代码必须单独运行,这是不得不通过将任务分解的方式让它们独立运行. 当任务和线程要 ...
- C# ManualResetEventSlim 实现
ManualResetEventSlim通过封装 ManualResetEvent提供了自旋等待和内核等待的组合.如果需要跨进程或者跨AppDomain的同步,那么就必须使用ManualResetEv ...
- .net core WebApi Interlocked配合ManualResetEventSlim实现并发同步
由于项目有某种需求,在WebApi中,有大量的请求需要操作相同的数据,因此需要用到并发同步机制去操作共享的数据. 本次配合使用Interlocked和ManualResetEventSlim来实现并发 ...
- 《C#多线程编程实战》2.6 ManualResetEventSlim
这个比较好理解的. 正如书上所言,如同一直在打开的大门的屋子,谁要进去,谁就自己的关门,出来的时候在开开. 常用的方法 有三个: Set() //设置为有信号,也就是让等待的线程不用继续等待,唤醒等 ...
- 一次 .NET Core 中玩锁的经历:ManualResetEventSlim, Semaphore 与 SemaphoreSlim
最近同事对 .net core memcached 缓存客户端 EnyimMemcachedCore 进行了高并发下的压力测试,发现在 linux 上高并发下使用 async 异步方法读取缓存数据会 ...
- 线程之间灵活传递信号(ManualResetEventSlim )
当主程序启动时,首先创建ManualResetEventSlim 类的一个实例.然后启动三个线程,等待事件信号通知它们继续执行. /// <summary> /// 创建 ManualRe ...
- C#多线程之线程同步篇3
在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...
- C#多线程之线程同步篇2
在上一篇C#多线程之线程同步篇1中,我们主要学习了执行基本的原子操作.使用Mutex构造以及SemaphoreSlim构造,在这一篇中我们主要学习如何使用AutoResetEvent构造.Manual ...
- C#多线程之线程同步篇1
在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...
- C# 线程同步的三类情景
C# 已经提供了我们几种非常好用的类库如 BackgroundWorker.Thread.Task等,借助它们,我们就能够分分钟编写出一个多线程的应用程序. 比如这样一个需求:有一个 Winform ...
随机推荐
- 谈谈Java的特点和优点以及选择Java的原因
如果面试官问你:请你说说Java的特点和优点,为什么要选择Java?你该怎么回答? 得分点 Java的特点 Java与C++的区别 Java的优点 标准回答 Java是一门非常纯粹的面向对象的编程 ...
- mybatis缓存源码解析
为什么使用缓存 减少和数据库交互次数,提高执行效率 mybatis的缓存 mybatis一级缓存,也就是局部的sqlSession级别的缓存,默认是开启的 每一个 session 会话都会有各自的缓存 ...
- 微信小程序直播,腾讯云直播+微信小程序实现实时直播
一:小程序代码端 小程序直播使用小程序组件 live-pusher 组件和live-player组件 首先开通直播权限 小程序开发工具内进行推流拉流都不会成功,所以需要使用两个手机进行推拉流测试: 1 ...
- [win10] 开始-设置 / 右键-显示设置 / 右键个性化 等都不好使了。。 ms-settings:display
现象: 各种win10自带的都打不开了. 发现: 最近总是断网,重启下就好了,然后点击网络,就一直出不来.后来发现所有win10的窗口都出不来了.控制面板等等. 解决:好消息是最后解决了.坏消息是没有 ...
- vue 可选链 功能 ?. 替代 res && res.status 可以变成 res?.status
安装 cnpm install --save-dev @babel/plugin-proposal-optional-chaining .babelrc { "presets": ...
- 29_SDL多线程与锁机制
目录 一.简介 二.代码实现: 2.1.声明 2.2.创建锁.消费者 2.3.销毁 2.4.实现生产者逻辑 2.5.实现销毁者逻辑 2.6.创建生产者 三.分装SDL锁机制 condmutex.h c ...
- find、grep、sed、awk命令(总结)
find.grep.sed.awk命令(总结) 大纲 *一.常见系统特殊符号* *(一)基础符号系列* *1)美元符号 $* *2)叹号符号 !* *3)竖线符号 |* *4)井号符号 #* *(二) ...
- [C++]使用auto遍历判断是否是最后一个元素
一.背景 略 二.代码 for(auto& it:vec){ if(&it==&vec.back()){ cout<<"is the last eleme ...
- KingbaseES错误unsupported for database link处理
KingbaseES使用dblink查询报错:unsupported for database link 适用于: KingbaseES所有版本. 问题现象: KingbaseES创建kingbase ...
- UE4接口
官方链接 目的 不同Actor对象具有同一个功能,比如角色按F键可以实现开门,开车,与NPC沟通等操作.其本质就是让所有的Actor对象除了继承UObject以外,再继承这个接口类. 接口的声明 宏的 ...