Monitor.TryEnter方法和lock语句的使用注意

在写代码时,习惯性的用了             
            lock (searchLock)
            {
                 .......................
            }
刚开始也没发现有什么不妥,可后来发现效率上有点问题。原因是lock会在外面等直到占用的线程退出下一个线程才能进去,当有大批量的数据访问时容易造成阻塞。而Monitor.TryEnter无论有没有获取对象锁都会返回结果。于是将代码改为如下:
            if (Monitor .TryEnter(searchLock))
            {
                try
                {
                    obj = LinkService.Search(count, search);
                    CacheHelper.AddGroup(searchGroupName, key, obj, 30);
                    CacheHelper.AddGroup(searchGroupName, key+"_old" , obj, 60);
                }
                finally
                {
                    Monitor.Exit(searchLock);
                }
            }
            else
            {
                 obj = CacheHelper.Get(key+"_old" ) as List<Model. xxx>;
                 if (obj == null )
                 {
                     obj = new List <Model. xxx>();
                 }
            }
posted @ 2012-10-15 22:06  永动机  阅读(2406)  评论(0编辑  收藏  举报