[netcore] 2022/6/18 13:53:09
在有并发操作数据(数据库/List/Dictionary/...)等操作时,如果不使用loca锁,会导致数据错误或者异常。
已经出现在系统中 模块自编码 功能中出现(SystemAutoCode)
解决方式:
class DemoLoca { private static readonly object _locker = new object(); private static Dictionary<int, DateTime> dic = new Dictionary<int, DateTime>(); public static void Demo() { //方式1 lock Parallel.For(0, 100, i => { lock (_locker) { dic.Add(i, DateTime.Now); } }); //方式2 Parallel.For(0, 100, i => { bool acquiredLock = false; try { // 3000表示3秒内如果未进入,则返回false Monitor.TryEnter(_locker, 3000, ref acquiredLock); if (acquiredLock == false) { //未获取到锁 } else { //获取锁后,可以继续进行 } }catch(Exception ex) { } finally { if (acquiredLock) { //退出锁 Monitor.Exit(_locker); } } }); } }方式1是方式2的语法糖写法,不过使用Monitor可以设置获取锁的时间,超时则不等待