最近我遇到了一个问题,我有一个集合在客户端应用程序中,我不断使用它来更新UI。这个集合可能会被服务器推送随时修改,导致有时会出现异常“无法继续枚举,因为集合已被修改”。我尝试了各种策略来解决这个问题,比如捕获错误并重新执行代码(感觉很糟糕),以及使用synclock来锁定集合(我认为这并不能完全锁定集合)。
我相信这不是一个新的问题,我想知道其他开发者是如何解决这个问题的。
我相信这不是一个新的问题,我想知道其他开发者是如何解决这个问题的。
foreach(var item in new List<ItemType>(collection))
{
...
}
foreach
循环内部没有修改集合,而是来自其他来源。 - MarcinJuraszeknew List <T>(IEnumerable <T> source)
构造函数将执行枚举),仍然有可能出现相同的错误。尽管这种情况发生的时间可能比原始的foreach
短,但仍然存在获得相同异常的风险。 - MarcinJuraszek你的问题实际上有两个部分。一是对可变集合进行迭代,但隐藏的复杂性是保持UI与可变集合同步。对于小集合和性能不会影响的区域,我会在foreach循环的末尾添加.ToList()。
foreach(var item in collection.ToList())
由于您似乎无法在迭代集合时锁定服务器更改,因此有几个建议:
for (...)
或while (...)
而不是foreach (...)
,以避免枚举器的“集合已修改”异常。请注意,您需要处理对集合的更改,例如在每次迭代时重新检查集合大小。