0

我有以下代码:

var actionsToExecute = _messagesToExecute.Where(m => m.CanExecute).ToList();

它在 99% 的时间内运行良好,但每隔一段时间它就会崩溃,但有以下异常:

Collection was modified; enumeration operation may not execute

我有点迷茫,因为它似乎有点随机。这是该方法的第一行。什么可能导致 lambda 表达式抛出此异常?

4

2 回答 2

1

它与线程有关。这似乎是网站代码。如果在执行 .ToList() 时,另一个访问该站点的人修改了该私有变量,则会发生该异常。

解决方案是使用线程安全集合,但这不是最佳选择,因为如果很多人正在读/写它,他们一次只能或多或少地做一个。

我遇到了类似的问题,但枚举并不重要,可以跳过或重复,所以我实现了自己的枚举器,它不检查它是否被修改。

于 2012-10-11T21:19:24.917 回答
1

您需要在所有对_messagesToExecute 的引用周围使用lock(),或者您可以使用System.Collections.Concurrent 中的一些东西来处理内部锁定集合。

例如

_messagesToExecute = new ConcurrentBag<TMessage>();

或者如果您更愿意使用锁定:

static readonly object m_lock = new object();

然后每当您更新列表时:

lock(m_lock){
  _messagesToExecute.Add(item);
}

然后当你拉出列表时:

lock(m_lock){
    var actionsToExecute = _messagesToExecute.Where(m => m.CanExecute).ToList();
}
于 2012-10-11T21:42:06.517 回答