架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 6285|回复: 2

[资料] 【实战】.NET/C# 使用 SemaphoreSlim 限制并发执行方法

[复制链接]
发表于 2022-2-19 21:23:20 | 显示全部楼层 |阅读模式
需求:由于硬件的资源是有限的,程序运行需要消耗一定的硬件资源,在高并发的情况下,如果程序某些占用资源过大的方法不加以限制(将大量数据导出成 Excel 表格),可能会影响整个程序的无法提供正常服务,也影响操作系统的正常运行,本文使用 SemaphoreSlim 信号量的方式来限制并发调用 .NET/C# 方法的次数。

Semaphore 和 SemaphoreSlim 区别

SemaphoreSlim 和 Semaphore 在功能上相似。SemaphoreSlim 比 Semaphore 快大约 4 倍,但 SemaphoreSlim 不能用于进程间信号。

性能提高的原因是因为 SemaphoreSlim 类提供了一个轻量级的替代 Semaphore 类,它不使用 Windows 内核信号量。本质上,如果您不需要命名信号量,请使用 SemaphoreSlim 类。

SemaphoreSlim 基于 SpinWait 和 Monitor,因此等待获取锁的线程会消耗一段时间的 CPU 周期,希望在让给另一个线程之前获取锁。如果这没有发生,那么线程让系统切换上下文并在操作系统再次调度该线程时再次尝试(通过消耗一些 CPU 周期)。如果等待时间很长,这种模式可能会消耗大量 CPU 周期。所以这种实现的最佳情况是大多数时候没有等待时间,你几乎可以立即获得锁。
Semaphore 依赖于 OS 内核中的实现,因此每次获取锁时,都会花费相当多的 CPU 周期,但之后线程会简单地休眠以获得锁所需的时间。

Semaphore 文档:https://docs.microsoft.com/en-us ... aphore?view=net-6.0
SemaphoreSlim 文档:https://docs.microsoft.com/en-us ... reslim?view=net-6.0

在执行方法前,常用的等待方法如下,请根据自己业务实际情况调用

Wait(): 阻塞线程,直至它可进入 SemaphoreSlim 为止。
Wait(0):方法不会阻止。 它将测试等待句柄的状态并立即返回。
Wait(正整数):阻止当前线程,直至它可进入 SemaphoreSlim 为止,同时使用 32 位带符号整数来指定超时。

源码如下:

效果图如下:

QQ截图20220219212238.jpg





上一篇:Linux 免密登录(ssh)或则免密复制(scp)文件到其它服务器
下一篇:【实战】Linux 使用 lookbusy 模拟 CPU 占用率
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2022-2-19 23:16:57 | 显示全部楼层
学习学习。。。
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
发表于 2022-2-20 22:19:24 | 显示全部楼层
test
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2024-6-2 03:53

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表