我使用ConditionalWeakTable
作爲弱事件處理程序實現的一部分。它工作正常,除了偶爾我會從我的用戶那裏得到自動崩潰日誌,表明對GetOrCreateValue()
的調用已經崩潰。ConditionalWeakTable.GetOrCreateValue()中的IndexOutOfRangeException
錯誤和調用堆棧看起來像下面的兩個棧之一,我認爲這取決於是否有一個現有的條目或新的一個需要得到創建:
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at System.Runtime.CompilerServices.ConditionalWeakTable`2.CreateEntry(TKey key, TValue value)
at System.Runtime.CompilerServices.ConditionalWeakTable`2.GetValue(TKey key, CreateValueCallback createValueCallback)
at [my code]
System.IndexOutOfRangeException: Index was outside the bounds of the array.
at System.Runtime.CompilerServices.ConditionalWeakTable`2.FindEntry(TKey key)
at System.Runtime.CompilerServices.ConditionalWeakTable`2.TryGetValueWorker(TKey key, TValue& value)
at System.Runtime.CompilerServices.ConditionalWeakTable`2.TryGetValue(TKey key, TValue& value)
at System.Runtime.CompilerServices.ConditionalWeakTable`2.GetValue(TKey key, CreateValueCallback createValueCallback)
at [my code]
(實際調用GetOrCreateValue()
出現已被內聯)
這裏是我的代碼,聲明ConditionalWeakTable
:
private static readonly ConditionalWeakTable<object, Dictionary<EventInfo, object>> s_sourceObjects = new ConditionalWeakTable<object, Dictionary<EventInfo, object>>();
這裏是我的代碼,CAL LS GetOrCreateValue()
:
Dictionary<EventInfo, object> events;
lock(s_sourceObjects)
events = s_sourceObjects.GetOrCreateValue(sourceObject);
下面是引用s_sourceObjects
領域唯一的其它地方:
bool success;
Dictionary<EventInfo, object> events;
lock(s_sourceObjects)
success = s_sourceObjects.TryGetValue(sourceObject, out events);
(我加了lock
發言,因爲我懷疑這是ConditionalWeakTable
線程安全漏洞,儘管文檔聲稱它是線程安全的。但是,即使使用lock
語句,該錯誤仍然存在,所以顯然這不是線程問題。)
我的應用程序使用.NET 4.6.2。
我是不是有點誤用或不理解ConditionalWeakTable
?或者這是一個框架錯誤?如果這是一個框架錯誤,有什麼辦法可以解決它嗎?
下面是該類的全部源代碼,如果任何人希望看到上下文:https://gist.github.com/waltdestler/2a339bdd0d7d647501eb4690772e3b50
他們是**只有**兩個地方你訪問'條件WeakTable'? – mjwills
@mjwills是的,那些只是**兩個地方(除了字段初始值設定項外)。 –
這個異常更可能與s_staticEvents相關。你是在'Debug'還是'Release'模式下運行? – mjwills