2017-08-11 77 views
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; 

所以internalData被密码锁住ReaderWriterLockSlim的所有操作,readerlock阅读和writerlock添加。我制作了锁内的项目副本,稍后再处理此副本。

问题出现一段时间后,越来越多的cpu-cores变为100%,最终使用所有内核。在停止之前,它可以完美运行数天和数百万次呼叫。

附加调试程序并暂停显示添加到结果字典时遇到的问题。但只要我恢复所有的线程将继续,并释放大量的内存。

调试器连接,暂停和恢复时会发生什么特别的事情,会释放这样的事情吗?

+1

[看看'一些限制:可靠性'部分](http://joeduffyblog.com/2007/02/07/introducing-the-new-readerwriterlockslim-in-orcas/)第三段读一点就像你所描述的那样。 (100%CPU猪)。是否有一个特定的原因,你为什么不使用'lock(internalData [Something])'? –

+0

我读了很多,而不是写,所以我希望不止一个读者在同一时间阅读,而不会只是锁。看看你的链接 – klundby

+0

uhm,当你从列表中读取时,是否有可能另一个线程将某些东西添加到同一个列表中?因为只要你不添加/删除/从列表中删除东西,你不需要锁定它。如果您正在同时读取和写入不同线程中的相同列表,则可以使用[Concurrent Namespace]中的某个更好的方法(https://msdn.microsoft.com/zh-cn/library/ system.collections.concurrent(v = vs.110).aspx) –

回答