【发布时间】:2018-01-19 16:54:21
【问题描述】:
我有一个使用 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;
因此,internalData 使用 ReaderWriterLockSlim 锁定所有操作,readerlock 用于读取,writerlock 用于添加。我制作了锁内物品的副本,稍后再处理此副本。
问题是一段时间后,越来越多的 cpu-cores 达到 100%,最后是使用所有核心。它可以在停止之前完美运行数天和数百万次调用。
附加调试器并暂停显示一个踏板在添加到结果字典时挂起。但是一旦我恢复,所有线程都会继续,并且会释放大量内存。
当附加调试器、暂停和恢复会释放类似这样的东西时,是否会发生一些特别的事情?
【问题讨论】:
-
Look at the 'Some limitations: reliability' part 第三段读起来有点像你所描述的。 (100% CPU 占用)。您不使用
lock( internalData[Something])是否有特定原因? -
我读的比写的多得多,所以我希望不止一个读者同时阅读,这不会只对锁定起作用。会看你的链接
-
嗯,当您从该列表中读取时,是否有可能另一个线程会将某些内容添加到同一列表中?因为只要您不向列表中添加/删除内容,您就不需要锁定它。如果您同时在不同线程中读取和写入相同的列表,最好使用Concurrent Namespace 中的内容
-
哦后续问题:您是否能够在附加调试器时重现此问题?这意味着如果您在 Visual Studio 中启动程序并让它运行,它是否也会在某个时候锁定?
-
另一个端点正在更改列表,所以我需要锁定。该问题在 Visual Studio 中无法重现,并且在生产服务器上间歇性发生。正如您在第一条评论中的链接中指出的那样,我已更改为另一个锁,并将查看它是否是阅读器内部的异常
标签: c# multithreading wcf