线程挂起,直到我附加调试器



我有一个使用 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用于所有操作,读取器锁用于读取,写入器锁用于添加。我复制了锁内的物品,稍后再处理此副本。

问题是一段时间后,越来越多的 CPU 内核达到 100%,最终使用所有内核。它可以在停止之前完美运行数天和数百万个呼叫。

附加调试器和暂停显示一个踏板挂起添加到结果字典。但是一旦我恢复,所有线程将继续,并且正在释放大量内存。

当附加调试器时,暂停和恢复会发布类似的东西时,是否发生了什么特殊的事情?

我将锁更改为 lock(something( { code... } 并且挂起的问题消失了。所以看起来我遇到了Steffen Winkler在他的评论中指出的问题。http://joeduffyblog.com/2007/02/07/introducing-the-new-readerwriterlockslim-in-orcas/

最新更新