在写代码时,习惯性的用了
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>();
}
}