我有多线程应用程序,但收到此错误
************** Exception Text **************
System.InvalidOperationException: Collection was modified; enumeration operation may not execute.
at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)
at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
at System.Collections.Generic.List`1.Enumerator.MoveNext()
...
我的收藏可能有问题,因为在一个线程上我读取了我的收藏,而在另一个线程上我修改了收藏。
public readonly ObservableCollectionThreadSafe<GMapMarker> Markers = new ObservableCollectionThreadSafe<GMapMarker>();
public void problem()
{
foreach (GMapMarker m in Markers)
{
...
}
}
我试图用此代码锁定集合,但不起作用。
public void problem()
{
lock(Markers)
{
foreach (GMapMarker m in Markers)
{
...
}
}
}
有什么想法可以解决这个问题吗?
这是一个非常常见的错误 - 在使用迭代时修改集合foreach
,请记住foreach
使用只读IEnumerator
实例。
尝试使用循环遍历集合for()
通过额外的索引检查,因此如果索引超出范围,您将能够应用额外的逻辑来处理它。您还可以使用 LINQCount()
作为另一个循环退出条件,通过评估Count
如果底层枚举未实现,则每次都值ICollection
:
If Markers
实施IColletion
- 锁定 SyncRoot:
lock (Markers.SyncRoot)
Use for()
:
for (int index = 0; index < Markers.Count(); index++)
{
if (Markers>= Markers.Count())
{
// TODO: handle this case to avoid run time exception
}
}
您可能会发现这篇文章很有用:C# 中的 foreach 循环如何工作? https://stackoverflow.com/a/398996/485076
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)