.net core WebApi并发同步
2021-07-09 19:04
标签:目的 mes 相关 线程 exce code ram tmp final 由于项目有某种需求,在WebApi中,有大量的请求需要操作相同的数据,因此需要用到并发同步机制去操作共享的数据。 本次配合使用Interlocked和ManualResetEventSlim来实现并发同步的目的。 Interlocked实现了原子性的操作,ManualResetEventSlim提供信号量等待唤醒机制。 以上两个关键字,自行找度娘了解。 代码如下: 逻辑是:如果Counter为0(非空闲),则证明已经有其他线程先一步进入当前逻辑,则当前线程需要等待5秒钟(5秒钟超时后继续执行代码),finally中的代码表示执行完后会将Counter置为1(空闲)并唤醒其他等待的线程,让其他线程在超时之前继续执行。 相关代码解释: Interlocked.CompareExchange(ref int number,int firstValue,int secondValue);该方法一共有三个参数,作用是:如果number和secondValue相等,则将firstValue引用赋值给number,否则不做任何操作,之后会返回number的原始值。参考如下代码: Interlocked.Exchange(ref int number,int value)的作用是将value引用赋值给number,并返回number的原始值。 .net core WebApi并发同步 标签:目的 mes 相关 线程 exce code ram tmp final 原文地址:https://www.cnblogs.com/williamwsj/p/9702340.html [HttpGet("[controller]/v1/api/[action]")]
public IActionResult Test() {
return Json(SynchronizationTest());
}
protected static int Counter = 1;//1:空闲 0:非空闲
protected static ManualResetEventSlim Mres = new ManualResetEventSlim(false);
public ResponseModel SynchronizationTest() {
ResponseModel rc = new ResponseModel(0, "初始化");
try {
//如果其他线程正在操作,则等待,5秒后超时
if (Interlocked.CompareExchange(ref Counter, 0, 1) == 0)
Mres.Wait(5000);
int count = RedisHelper.Get(GoodsNumberKey).ToInt32();
if (count > 0) {
RedisHelper.Set(GoodsNumberKey, "-1");
rc.SetMessage("重置成功!");
}
else rc.SetMessage("已被重置,本次重置无效");
}
catch (Exception ex) {
_log.Error(ex);
}
finally {
//转为空闲状态
Interlocked.Exchange(ref Counter, 1);
//设置信号量,让上面的 Mres.Wait(5000);取消等待,继续执行代码
Mres.Set();
}
return rc;
}
int tmp = number;
ref number = number==secondValue?firstValue:number;
return tmp;