地址“修改:枚举操作可能会失败”错误
>>错误“集合已修改;枚举操作可能不会执行”,当收集在迭代时被更改时,会导致不可预测的行为。这通常发生在多线程的各个方案中,其中多个线程同时访问和修改同一集合。
这个特定的错误在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中文网其他相关文章!