【问题标题】:Enumeration collection was modified resistant枚举集合被修改了抗性
【发布时间】:2013-06-30 15:12:23
【问题描述】:

是否有完全消除此错误的包装器?我在多个线程上有多个循环,我无法预测集合是否会在 foreach 中间被修改,我想通过捕获这个特定错误并为集合获取新处理程序很容易实现并循环遍历其余元素,但是我还不够先进,无法使用这样的函数覆盖默认行为。

【问题讨论】:

  • IEnumerable.ToArray()

标签: c#


【解决方案1】:

假设您使用的是 .NET 4,您可以使用 System.Collections.Concurrent 中的集合之一,例如 ConcurrentBag。但是,您并没有真正指定任何要求,因此很难知道ConcurrentBag 本身是否能够满足这些要求。

如果您阅读了大多数集合的线程安全文档,您会发现它们不支持在另一个线程读取(或修改)集合时从一个线程进行安全修改,而无需锁定。如果没有被任何东西修改,从多个线程读取 List<T> 等是可以的,但你甚至不应该有一个线程修改它。

理想情况下,尝试设计您的代码,以便您需要这种对共享集合的无限制写访问权限 - 但如果您真的需要它,请使用专为它设计的类型。 p>

【讨论】:

  • @user2534406:您可以使用 ConcurrentDictionary 作为集合,而忽略该值。数组没有等价物......尽管由于固定大小,故障模式无论如何都是不同的。 (这就是问题所在——你没有给我们任何实际要求……)
  • @user2534406,我认为您可以尝试锁定机制,但在这种情况下,您必须考虑任何尝试修改您的数组(在锁定模式下)的线程都应该等待轮到它。您可以查看stackoverflow.com/questions/59590/lock-keyword-in-c-sharpstackoverflow.com/questions/6029804/… 链接以检查其工作原理以及何时使用。我遇到了类似的问题,锁定为我节省了一些时间。
  • 不能使用锁。
  • @user2534406:好吧,恐怕我已经给了你我所能提供的所有帮助,我怀疑其他人也是如此,因为你在问题中提供的信息不足,并且厘米。我们不知道您想要实现什么,或者您可以使用什么。希望我的回答对您有所帮助,但如果没有,恐怕您必须提供更多信息。
  • 我已经给出了非常具体的描述,您还需要什么其他信息?如果抛出修改后的集合异常,我只想获取最新集合的处理程序
猜你喜欢
  • 2012-04-30
  • 1970-01-01
  • 1970-01-01
  • 2017-07-07
  • 1970-01-01
  • 2012-04-13
  • 1970-01-01
相关资源
最近更新 更多