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

标签 c# multithreading wcf

我有一个使用 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 核心达到 100%,最后使用所有核心。它可以在停止前完美运行数天和数百万次调用。

附加调试器并暂停显示一个步骤卡在添加到结果字典上。但是一旦我恢复,所有线程都会继续,并且会释放大量内存。

当调试器被附加、暂停和恢复时会发生什么特别的事情会释放这样的东西吗?

最佳答案

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

关于c# - 线程挂起,直到我附加调试器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45630677/

相关文章:

c# - .Net 与 Cocoa 字符串格式

c# - 公开一个类作为 STA COM

带压缩的 WCF 消息安全性

c# - 用 C# 编写驱动程序

c# - 反序列化大 JSON 数组

java - 创建和使用匿名 Runnable 类的最佳方式

c# - 始终在 WCF 服务中使用 Json 返回 XML 字符串

wcf - WCF 服务如何向其客户端引发事件?

java - 如果线程 B 希望看到线程 A 所做的更改,是否只能将最后的更改更改为 volatile 变量而不是全部?

java - 如果我在同一个类上同步了两个方法,它们可以同时运行吗?