地址“修改:枚舉操作可能會失敗”錯誤
>>錯誤“集合已修改;枚舉操作可能不會執行”,當收集在迭代時被更改時,會導致不可預測的行為。這通常發生在多線程的各個方案中,其中多個線程同時訪問和修改同一集合。
這個特定的錯誤在NotifySubscribers()
>方法中表現出來,其中subscribers
字典在foreach
>循環中訪問。 同時修改此詞典(例如,客戶端訂閱或取消訂閱)無效枚舉。
>解決方案:實施線程安全
> 為了解決這個問題,
subscribers
:>用ConcurrentDictionary
替換標準字典。此數據結構本質上是線程安全,可以防止錯誤。 >
ConcurrentDictionary<TKey, TValue>
循環之前,使用創建foreach
>
subscribers
subscribers.Values.ToList()
這是修改為使用的方法:
>這是使用NotifySubscribers()
創建安全副本的版本:ConcurrentDictionary
>
<code class="language-csharp">public void NotifySubscribers(DataRecord sr) { foreach (Subscriber s in subscribers.Values) // subscribers is now a ConcurrentDictionary { try { s.Callback.SignalData(sr); } catch (Exception e) { DCS.WriteToApplicationLog(e.Message, System.Diagnostics.EventLogEntryType.Error); UnsubscribeEvent(s.ClientId); } } }</code>>通過實施這些解決方案中的任何一種,您可以確保線程安全並防止“收集”錯誤...
以上是如何處理'收集”;枚舉操作可能不會在多線程環境中執行'錯誤”錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!