详见下面的代码:
private static object asynclocker = new object(); private static List<string> processingOrders = new List<string>(); private static bool CheckSession(string orderid) { lock (asynclocker) { bool isExists = processingOrders.Find(s => s.ToLower().Trim() == orderid.ToLower().Trim()) == null; if (isExists) { processingOrders.Add(orderid.ToLower().Trim()); } return isExists; } } 使用: //正在处理中 if (!CheckSession(notifyModel.OutTradeId)) { throw new JSJException("订单正在处理中……"); }
测试代码:
List<Task<string>> tasks = new List<Task<string>>(); for (var i = 0; i<=5; i++) { tasks.Add(Task.Factory.StartNew<string>(() => { return this.PayOrder(); })); } Task.WaitAll(tasks.ToArray()); foreach (var task in tasks) { Console.WriteLine(task.Result); }
结果:
success
订单正在处理中……
success
订单正在处理中……
订单正在处理中……
订单正在处理中……
请教大神们这是什么原因呢?
lock (asynclocker) { bool isExists = processingOrders.Find(s => s.ToLower().Trim() == orderid.ToLower().Trim()) == null; if (isExists) { processingOrders.Add(orderid.ToLower().Trim()); } return isExists; }
这是作用域,执行完那么asynclocker 就Exit()了;
你还想怎么锁 —— 不让第二次执行?不让第二次执行,你只需要拿个静态变量累加并判断。
嗯嗯 好的 谢谢的回答,问题找到了,是自己的逻辑代码 写的有问题了,在finally 中对 list 集合进行了一次 移除操作,所以就会出现这个问题。