详见下面的代码:
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
订单正在处理中……
订单正在处理中……
订单正在处理中……
请教大神们这是什么原因呢?
相关问题
- C# System.Threading.ThreadAbortEXception
- java 线程类无法注入问题,求解决
- C# 用来接收消息的Socket在结束后,接收消息的线程是否会停止并被回收
- 为什么set get 不能一直保存变量值呢
- join方法内部实际是wait方法,不能理解的是 在a线程中,b线程调用了join方法,为什么是a线
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()了;
你还想怎么锁 —— 不让第二次执行?不让第二次执行,你只需要拿个静态变量累加并判断。