这两天在Wcf中使用Static List泛型对象保存了一个经常使用的一个SharePoint列表对象(大概2000条数据吧),可是这个列表有可能经常更新,所以
就设定每天读取一次。使用该List的控件在一个地方使用一切正常,可是当这个控件也在其它地方使用时,就出现了多个重复的对象。由于数据每天更新
,想有可能是重复数据问题,可是检查了下,不是这个问题。原来是多线程造成的。
可是也怪,一个地方用到这个控件,在多人使用的情况下,只产生一个线程,不会出现重复的现象。就想到是多线程造成该问题,决定在这个方法内加
个锁Lock,每次添加的时候,先加锁。
private static object lockObj = new object();
private static List<SPS> SPSList = new List<SPS>();
lock(lockObj)
{
SPSList.clear();
SPSList.Add(sps); ... //这个会添加2000多条记录。
}
这样解决了重复的问题,可是我不想让同事执行该操作的人,有等待的过程,因为WCF等待时间过长会有超时的异常发生。看来Lock这个语法糖满足不了
要求了,就直接用Monitor来解决(实际上lock是对Monitor类的包装),解决的代码如下:
if(Monitor.TryEnter(lockObj))
{
SPSList.clear();
SPSList.Add(sps); ... //这个会添加2000多条记录。
Monitor.Exit(lockObj);
}
else
{
return SPSList;
}
上面的代码解决了线程在执行添加操作的时候,不耽误别的线程读取数据。可是又有新问题了,因为数据量比较大,操作时间比较长,有时在执行了
clear()后,数据还没添加完,就被别的线程拿去用了。就像到了,先把数据放到一个变量里,添加完数据后,再赋值给清空的SPSList。