结论:1.SemaphoreSlim会限制访问资源的线程数
2.在异步async/await情况下,SemaphoreSlim会限制正在执行访问资源的Task的数量
例三static void SemaphoreTest2(){var semaphore = new SemaphoreSlim(5);for (int i = 1; i <= 10; i++){Thread.Sleep(100); // 排队上桥var index = i; // 定义index 避免出现闭包的问题Task.Run(async () =>{Console.WriteLine($"第{index}个人已抵达桥边上 。线程Id" + Thread.CurrentThread.ManagedThreadId);await semaphore.WaitAsync();try{Console.WriteLine($"第{index}个人正在过桥 。线程Id" + Thread.CurrentThread.ManagedThreadId);await Task.Delay(5000);// 模拟过桥需要花费的时间}finally{Console.WriteLine($"第{index}个人已经过桥 。线程Id" + Thread.CurrentThread.ManagedThreadId);semaphore.Release();}});}}执行结果
文章插图
例三中我使用了 await semaphore.WaitAsync();,也就是说不存在同步阻塞代码了,全部都是异步 。
异步下遇到await,执行等待,那么当前执行这个Task的线程可能会被“任务调度器拿去执行别的Task”
结论:1.在异步async/await情况下,SemaphoreSlim会限制正在执行访问资源的Task的数量, 与例二第二个结论一致 。
异步下的Lock锁鉴于SemaphoreSlim的特殊性,可以使用其通过程序角度来实现“锁”(叫乐观锁、还是悲观锁???,我去,两者好像都不是
文章插图
)
乐观锁与悲观锁定义如下图
文章插图
如下图代码:
重点代码 SemaphoreSlim _semaphore = new(1)
如果真要说明,我觉得是最多像 悲观锁,但又不全是 。这里的SemaphoreSlim只是说同一时刻只准一个线程或正在执行的Task做保存操作,那么如果是分布式程序呢,另一个程序此时也执行保存操作?
我觉得其真实原因是:使用SemaphoreSlim可以实现异步下的 Lock 锁 。
文章插图
文章插图
文章插图
【.Net SemaphoreSlim】
经验总结扩展阅读
- 迪奥720和840哪个好看_迪奥720和840试色对比
- 一个榴莲能剥出多少果肉
- 冻虾放了8个月还能吃吗
- 如何判断青芒可以吃了
- 梭子蟹分公母怎么分辨
- 【ASP.NET Core】MVC控制器的各种自定义:应用程序约定的接口与模型
- 2023年9月6日看病好不好 2023年9月6日是看病的黄道吉日吗
- 2023年9月6日是看望病人的黄道吉日吗 2023年9月6日是看望病人吉日吗
- “黑绷带的力量” 首先,它有一个奇怪的名字,叫“黑绷带” 其次,在看产品介绍之初,它是一款晚霜。
- 纪梵希n37和兰蔻505哪个好看?哪个值得买?