我有一个使用WCF的服务。在内部,它有一个包含列表的字典,您可以添加或从不同的端点获取子集。
代码是这样的:
List<Data> list = null;
try
{
locker.EnterReadLock();
list = internalData[Something].Where(x => x.hassomething()).ToList();
}
finally
{
locker.ExitReadLock();
}
foreach (var y in list)
{
result[y.proprty1].Add(y.property2); // <-- here it hangs
}
return result;
因此,对于所有操作,使用ReaderWriterLockSlim锁定internalData,使用readerlock进行读取,使用writerlock进行添加。我复制了锁中的项目,稍后再处理这个副本。
问题是过了一段时间,越来越多的cpu核心达到100%,最后使用所有核心。它可以在停止之前完美运行数天和数百万次通话。
附加调试器和暂停显示添加到结果字典时会出现问题。但是一旦我恢复,所有线程都将继续,并且正在释放大量内存。
附加调试器时是否会发生特殊情况,暂停和恢复将释放这样的内容?
答案 0 :(得分:0)
我将锁更改为锁定(某些){code ...}并且挂起的问题消失了。所以看起来lilke我遇到了Steffen Winkler在他的评论中指出的问题。 http://joeduffyblog.com/2007/02/07/introducing-the-new-readerwriterlockslim-in-orcas/