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

4

我有一个使用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锁定内部数据,读取使用readerlock,添加使用writerlock。我在锁定内部的项目后复制这些项,并在稍后对其进行操作。

问题是一段时间后,越来越多的CPU核心占用率达到100%,最终使用所有核心。它可以完美运行数天和数百万次调用,然后停止。

连接调试器并暂停显示一个线程挂起以在结果字典中添加内容。但是一旦恢复,所有线程都将继续运行并释放大量内存。

当调试器附加,暂停和恢复时,是否发生了类似于此类问题的释放?


1
请看“一些限制:可靠性”部分,第三段读起来有点像你所描述的(100% CPU 占用)。你为什么不使用“lock( internalData[Something])”?有特定的原因吗? - Steffen Winkler
我更多地阅读而不是写作,因此我希望有多个读取器同时读取,这不能仅靠锁来实现。我会查看您提供的链接。 - klundby
嗯,当您从该列表中读取时,是否可能有另一个线程向同一列表添加内容?因为只要您不向列表中添加/删除任何内容,就不需要锁定它。如果您在不同的线程中同时读写同一列表,则最好使用Concurrent Namespace中的某些内容。 - Steffen Winkler
跟进问题:你能否在调试器附加的情况下重现此问题?也就是说,如果你在Visual Studio中启动程序并让它运行,它是否会在某个时候锁定? - Steffen Winkler
另一个端点正在更改列表,因此我需要锁定。问题在 Visual Studio 中无法复现,在生产服务器上间歇性地发生。我已更改为另一个锁,并将查看是否是您在第一条评论中指出的读取器内异常。 - klundby
如果更改锁定机制起作用,请回信告知。如果是这样,请考虑使用该答案自我回答您的问题。 - Steffen Winkler
1个回答

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接