[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可以设置获取锁的时间,超时则不等待