首页新闻找找看学习计划

为什么线程中的locke 没有锁住呢

0
悬赏园豆:5 [已解决问题] 解决于 2018-02-06 10:20

详见下面的代码:

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
订单正在处理中……
订单正在处理中……
订单正在处理中……

 

请教大神们这是什么原因呢?

IT小伙儿的主页 IT小伙儿 | 初学一级 | 园豆:11
提问于:2018-02-06 09:57
< >
分享
最佳答案
0

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()了;

你还想怎么锁 —— 不让第二次执行?不让第二次执行,你只需要拿个静态变量累加并判断。

收获园豆:5
花飘水流兮 | 专家六级 |园豆:10527 | 2018-02-06 10:06

嗯嗯 好的 谢谢的回答,问题找到了,是自己的逻辑代码 写的有问题了,在finally 中对 list 集合进行了一次 移除操作,所以就会出现这个问题。

IT小伙儿 | 园豆:11 (初学一级) | 2018-02-06 10:19
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册