2017-08-11 73 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) –

回答