C# 信号锁SemaphoreSlim
关于锁,我们经常会使用lock object对象,进行资源访问的限制。

但,lock是有限制的,无法添加异步方法。编译器会报错。
下面推荐另一个类SemaphoreSlim,这是信号量的一个使用类。先看下面的使用:
1 private async void MainWindow_Loaded(object sender, RoutedEventArgs e)
2 {
3 var tasks = new List<Task>();
4 for (int i = 0; i < 10; i++)
5 {
6 var message = $"message{i}";
7 tasks.Add(Task.Run(async () =>
8 {
9 await LockWithSemaphore(message);
10 }));
11 }
12 await Task.WhenAll(tasks);
13 }
14 private SemaphoreSlim _asyncLock = new SemaphoreSlim(1);
15 async Task LockWithSemaphore(string title)
16 {
17 Console.WriteLine($"{title} waiting for lock");
18 await _asyncLock.WaitAsync();
19
20 Console.WriteLine($"{title} starting");
21 await Task.Delay(200);
22 Console.WriteLine($"{title} ending");
23
24 _asyncLock.Release();
25 }
输出结果:

从控制台结果可以看出,SemaphoreSlim 完美的完成了异步场景下的锁操作,严格的保持了并发操作的互斥。
SemaphoreSlim类,从源码来看,内部其实是使用了ManualResetEvent:

关于信号锁,常用的有AutoResetEvent和ManualResetEvent,在线程同异步处理场景下比较常见。
SemaphoreSlim,能做的事还有很多,比如:
1. 下载并发时,限制下载并行数量为5个。我们就可以通过设置SemaphoreSlim为5来实现。
2. 访问数据库、或者硬件设备时,需要限制访问数量为1。
C# 信号锁SemaphoreSlim的更多相关文章
- AutoResetEvent信号锁 waitone set 执行一次线程退出 挺不爽的地方
下边有个 循环调用线程写奇偶数的程序 class TheadTest { //定义一个Stream对象接收打开文件 private FileStream st; //构造方法 public Thead ...
- C#并行编程 (Barrier,CountdownEvent,ManualResetEventSlim,SemaphoreSlim,SpinLock,SpinWait )
背景 有时候必须访问变量.实例.方法.属性或者结构体,而这些并没有准备好用于并发访问,或者有时候需要执行部分代码,而这些代码必须单独运行,这是不得不通过将任务分解的方式让它们独立运行. 当任务和线程要 ...
- Redis分布式锁 (图解-秒懂-史上最全)
文章很长,而且持续更新,建议收藏起来,慢慢读! 高并发 发烧友社群:疯狂创客圈(总入口) 奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : 极致经典 + 社群大片好评 < Java 高并发 三 ...
- C#并行编程-线程同步原语
菜鸟学习并行编程,参考<C#并行编程高级教程.PDF>,如有错误,欢迎指正. 目录 C#并行编程-相关概念 C#并行编程-Parallel C#并行编程-Task C#并行编程-并发集合 ...
- 【iCore3应用开发平台】发布 iCore3 应用开发平台出厂代码rev0.0.5
iCore3开发平台固件版本信息 =============================================================[stm32f407]:iCore3 ARM ...
- AutoResetEvent waitone set进一步理解补充
AutoResetEvent 的定义 //定义两个信号锁 AutoResetEvent ReadTxt = new AutoResetEvent(false); AutoResetEvent Uplo ...
- 【一】 sched.h
第一个数据结构体是 task_struct ,这个数据结构被内核用来表示进程,包含其所有信息. 定义于文件 include/linux/sched.h 中,先看看其完整定义 struct task_s ...
- MCS-51单片机的指令时序
时序是用定时单位来描述的,MCS-51的时序单位有四个,它们分别是节拍.状态.机器周期和指令周期,接下来我们分别加以说明. 节拍与状态: 我们把振荡脉冲的周期定义为节拍(为方便描述,用P表示), ...
- 单片微机原理P3:80C51外部拓展系统
外部拓展其实是个相对来说很好玩的章节,可以真正开始用单片机写程序了,比较重要的是外部存储器拓展,81C55拓展,矩阵键盘,动态显示,DAC和ADC. 0. IO接口电路概念与存储器拓展 1. 为什 ...
随机推荐
- Angular 管道和路由
管道pipe: 要在HTML模板中指定值转换,请使用管道运算符(|). {{interpolated_value | pipe_name}} 您可以链接管道,发送一个管道功能的输出以被另一个管道功能转 ...
- webpack 3/4踩坑,我太难了,从安装、卸载、到使用,各相应的版本号,sass-loader报错-版本的原因,webpack -v 不识别,没卸载干净
-先说卸载: wabpack@4对应的每个插件的版本号都在最后 1 全局安装的话,npm uninstall webpack -g 有时候并不能卸载干净, 2 webpack -v 可判断是否安装成 ...
- Java开发词汇
Java基础常见英语词汇(70个) OO: object-oriented ,面向对象 OOP: object-oriented programming,面向对象编程 JDK:Java develop ...
- Caused by: java.lang.NoClassDefFoundError: net/minidev/asm/FieldFilter 报错的解决
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'r ...
- Java面向对象 --2
22.面向对象特征之二: 继 承 2020-04-29 21:39:33 01.多个类中存在相同属性和行为时,将这些内容抽取到单独一个类中,那么子类无需再定义这些属性和行为,只要继承父类即 ...
- Cisco Packet Tracer(思科模拟器)安装,注册用户
下载 下载地址见湖南科技大学老师:http://mooc1.xueyinonline.com/nodedetailcontroller/visitnodedetail?courseId=2226402 ...
- linux网络编程中的errno处理
在Linux网络编程中,errno是一个非常重要的变量.它记录了最近发生的系统调用错误代码.在编写网络应用程序时,合理处理errno可以帮助我们更好地了解程序出现的问题并进行调试. 通常,在Linux ...
- iText5实现Java生成PDF
参考代码:https://github.com/youcong1996/study_simple_demo 参考博客:https://blog.csdn.net/weixin_37848710/art ...
- 如何解决 Iterative 半监督训练 在 ASR 训练中难以落地的问题丨RTC Dev Meetup
前言 「语音处理」是实时互动领域中非常重要的一个场景,在声网发起的「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」活动中,来自微软亚洲研究院.声网.数美科技的技术专家,围绕该话 ...
- Out Of Memory 案例
案例一:老年代内存泄漏 某晚八点收到报警邮件,一看是OOM: 打开 hickwall查看指标:JVM各项指标中 老年代在持续增长(从上次发布10月30号到11月10号的 12天 一直在增长,存在内 ...