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>();
}
}
作者:KeepMoving
出处:http://www.cnblogs.com/KeepMovingblog/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
出处:http://www.cnblogs.com/KeepMovingblog/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。