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%,最終使用所有內核。在停止之前,它可以完美運行數天和數百萬次呼叫。
附加調試程序並暫停顯示添加到結果字典時遇到的問題。但只要我恢復所有的線程將繼續,並釋放大量的內存。
調試器連接,暫停和恢復時會發生什麼特別的事情,會釋放這樣的事情嗎?
[看看'一些限制:可靠性'部分](http://joeduffyblog.com/2007/02/07/introducing-the-new-readerwriterlockslim-in-orcas/)第三段讀一點就像你所描述的那樣。 (100%CPU豬)。是否有一個特定的原因,你爲什麼不使用'lock(internalData [Something])'? –
我讀了很多,而不是寫,所以我希望不止一個讀者在同一時間閱讀,而不會只是鎖。看看你的鏈接 – klundby
uhm,當你從列表中讀取時,是否有可能另一個線程將某些東西添加到同一個列表中?因爲只要你不添加/刪除/從列表中刪除東西,你不需要鎖定它。如果您正在同時讀取和寫入不同線程中的相同列表,則可以使用[Concurrent Namespace]中的某個更好的方法(https://msdn.microsoft.com/zh-cn/library/ system.collections.concurrent(v = vs.110).aspx) –