C#中的信号量---Semaphore
c# --- 信号量 Semaphore
2023-09-14 09:12:37 时间
Semaphore是System.Threading下的类,限制可同时访问某一资源或资源池的线程数。
常用构造方法
https://msdn.microsoft.com/zh-cn/library/e1hct27h(v=vs.110).aspx
public Semaphore( int initialCount, int maximumCount )
参数
- initialCount
- Type: System.Int32
可以同时授予的信号量的初始请求数。
- maximumCount
- Type: System.Int32
可以同时授予的信号量的最大请求数。
示例代码
class Program { static Semaphore sema = new Semaphore(1,1); static void Main(string[] args) { for (int i = 0; i < 3; i++) { var thread = new Thread(Test) { Name = $"Thread{ i }" }; thread.Start(); } Console.ReadKey(); } static void Test() { sema.WaitOne(); for (int i = 0; i < 3; i++) { Console.WriteLine($"ThreadName:{ Thread.CurrentThread.Name} i:{i}"); Thread.Sleep(1000); } sema.Release(); Console.ReadKey(); } }
代码说明:
static Semaphore sema = new Semaphore(1,1);
声明一个信号量,指示控制的资源初始和最大线程并发数为1
sema.WaitOne();
for (int i = 0; i < 3; i++)
{
Console.WriteLine($"ThreadName:{ Thread.CurrentThread.Name} i:{i}");
Thread.Sleep(1000);
}
sema.Release();
使用以上两个方法控制资源,某个线程执行sema.WaitOne()方法时,若有其他线程已经占用资源,此方法将阻塞,直到,其他线程释放,即调用sema.Release();方法
执行效果如下:
同一段时间内,只有一个线程进入共享资源中。
以下是最大并发数为2的执行效果:
static Semaphore sema = new Semaphore(2,2);
同一段时间内,有两个线程进入了贡献资源中
相关文章
- C# Index 定义索---引具体使用
- C#异步编程二
- C# 对象池的实现(能限制最大实例数量,类似于WCF的MaxInstanceCount功能)
- C#的DataGridView如何修改字体
- C#中的Byte,String,Int,Hex之间的转换函数。
- c# MVC BundleConfig详解
- C# Winform学习---MDI窗体的设计,PictureBox控件(图片上一页下一页),Timer控件,MenuStrip控件
- C# Excel数据验重及Table数据验重
- Atitit. c# 语法新特性 c#2.0 3.0 4.0 4.5 5.0 6.0 attilax总结 1. 版本历史1 1.1. C# 1.0-纯粹的面向对象2 1.2. C# 2.0
- Atitit.跨语言反射api 兼容性提升与增强 java c#。Net php js
- C# 继承
- C# 属性设置
- [0] C#实现WebBrowser&HTML交互
- C#WinForm线程基类
- C#里使用ExcelDataReader读取EXCEL文件的简单方法
- (2)C# 多线程更新界面的错误方法
- C#设计模式之建造者模式
- C#:基于WMI查询USB设备信息 及 Android设备厂商VID列表
- C# 遍历数组获取最小值及下标(包含最大值)