前言

后续会把异步编程的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的更多相关文章

  1. C#并行编程 (Barrier,CountdownEvent,ManualResetEventSlim,SemaphoreSlim,SpinLock,SpinWait )

    背景 有时候必须访问变量.实例.方法.属性或者结构体,而这些并没有准备好用于并发访问,或者有时候需要执行部分代码,而这些代码必须单独运行,这是不得不通过将任务分解的方式让它们独立运行. 当任务和线程要 ...

  2. C# ManualResetEventSlim 实现

    ManualResetEventSlim通过封装 ManualResetEvent提供了自旋等待和内核等待的组合.如果需要跨进程或者跨AppDomain的同步,那么就必须使用ManualResetEv ...

  3. .net core WebApi Interlocked配合ManualResetEventSlim实现并发同步

    由于项目有某种需求,在WebApi中,有大量的请求需要操作相同的数据,因此需要用到并发同步机制去操作共享的数据. 本次配合使用Interlocked和ManualResetEventSlim来实现并发 ...

  4. 《C#多线程编程实战》2.6 ManualResetEventSlim

    这个比较好理解的. 正如书上所言,如同一直在打开的大门的屋子,谁要进去,谁就自己的关门,出来的时候在开开. 常用的方法 有三个: Set()  //设置为有信号,也就是让等待的线程不用继续等待,唤醒等 ...

  5. 一次 .NET Core 中玩锁的经历:ManualResetEventSlim, Semaphore 与 SemaphoreSlim

    最近同事对  .net core memcached 缓存客户端 EnyimMemcachedCore 进行了高并发下的压力测试,发现在 linux 上高并发下使用 async 异步方法读取缓存数据会 ...

  6. 线程之间灵活传递信号(ManualResetEventSlim )

    当主程序启动时,首先创建ManualResetEventSlim 类的一个实例.然后启动三个线程,等待事件信号通知它们继续执行. /// <summary> /// 创建 ManualRe ...

  7. C#多线程之线程同步篇3

    在上一篇C#多线程之线程同步篇2中,我们主要学习了AutoResetEvent构造.ManualResetEventSlim构造和CountdownEvent构造,在这一篇中,我们将学习Barrier ...

  8. C#多线程之线程同步篇2

    在上一篇C#多线程之线程同步篇1中,我们主要学习了执行基本的原子操作.使用Mutex构造以及SemaphoreSlim构造,在这一篇中我们主要学习如何使用AutoResetEvent构造.Manual ...

  9. C#多线程之线程同步篇1

    在多线程(线程同步)中,我们将学习多线程中操作共享资源的技术,学习到的知识点如下所示: 执行基本的原子操作 使用Mutex构造 使用SemaphoreSlim构造 使用AutoResetEvent构造 ...

  10. C# 线程同步的三类情景

    C# 已经提供了我们几种非常好用的类库如 BackgroundWorker.Thread.Task等,借助它们,我们就能够分分钟编写出一个多线程的应用程序. 比如这样一个需求:有一个 Winform ...

随机推荐

  1. Educational Codeforces Round 145 (Rated for Div. 2)C. Sum on Subarrays(构造)

    很意思的一道构造题 题意:给一个\(n.k\),让构造长度为n的数组满足,子数组为整数的个数为k个,负数的为\(k-(n+1)* n/2\),每个数的范围为\([-1000,1000]\) 这种构造题 ...

  2. 从零开始学Spring Boot系列-集成mybatis

    在Spring Boot的应用开发中,MyBatis是一个非常流行的持久层框架,它支持定制化SQL.存储过程以及高级映射.在本篇文章中,我们将学习如何在Spring Boot项目中集成MyBatis, ...

  3. JS5-PC端网页特效

    常见offset系列属性作用 常见client系列属性作用 常见scroll系列属性作用 封装简单动画函数 写出网页轮播图案例 offset 偏移量,使用offset相关属性可以动态的得到该元素的位置 ...

  4. MP实现ID自增 &日志 &自动填充 & 逻辑删除 &乐观锁

    默认ID自增 mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl 此时的依赖 <dep ...

  5. mybatis-plus处理blob字段

    转载自:www.javaman.cn 在 Spring Boot 项目中使用 MyBatis-Plus 处理 longblob 字段时,我们可以按照以下步骤进行操作.假设 longblob 存储的是字 ...

  6. String类为什么要用final修饰?

    final修饰符的意义? https://www.cnblogs.com/loren-Yang/p/13380318.html String类被实现的目标是什么? 效率和安全 如何实现期望? 参考文献 ...

  7. Android 开发Day3

    每次重新创建一个项目时,需要下载所对应的.gradle文件,但是你的磁盘里有相应的.gradle文件,随着你创建的Project越多,下载的gradle文件就会越多,占用内存就会越大 . 解决方案: ...

  8. 如何让AR物体更真实?

    在增强现实中,除了虚拟物体本身的模型材质等因素,影响物体真实性的主要是光照.反射.阴影.接下来3DCAT实时渲染云平台将带您从这三个方面探索如何让AR物体更真实! AR光估测 要让一个虚拟物体很好的融 ...

  9. python面向对象(绑定方法与非绑定方法)

    # 一.绑定方法:特殊之处在于将调用者本身当做第一个参数自动传入 # 1)绑定给对象的方法:调用者是对象,自动传入的是对象 # 2)绑定给类的方法:调用者是类,自动传入的是类 # 类方法的应用 # 需 ...

  10. 绘制三元图、颜色空间图:R语言代码

      本文介绍基于R语言中的Ternary包,绘制三元图(Ternary Plot)的详细方法:其中,我们就以RGB三色分布图为例来具体介绍.   三元图可以从三个不同的角度反映数据的特征,因此在很多领 ...