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

Posted

技术标签:

【中文标题】线程挂起,直到我附加调试器【英文标题】:Threads hang until i attach debugger 【发布时间】: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 中无法重现,并且在生产服务器上间歇性发生。正如您在第一条评论中的链接中指出的那样,我已更改为另一个锁,并将查看它是否是阅读器内部的异常 【参考方案1】:

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

【讨论】:

以上是关于线程挂起,直到我附加调试器的主要内容,如果未能解决你的问题,请参考以下文章

调试 gradle bootRun 有 server=n

调试 gradle bootRun 有 server=n

如何暂停powershell脚本,直到调试器附加

如果我单步调试阻塞的线程会发生啥?

IIS 6 Hangs ,然后应用程序池重置。附加的 IIS 调试诊断转储

Windows调试1.WinDbg基本使用-异常基础知识