
码:
public static string GetValue(List<StateBag> stateBagList,string name){ string retValue = string.Empty; if (stateBagList != null) { foreach (StateBag stateBag in stateBagList) { if (stateBag.name.Equals(name,StringComparison.InvariantCultureIgnoreCase)) { retValue = stateBag.Value; } } } return retValue;} 在某个时间点获得此异常并非每次都在这个地方.
堆栈跟踪:
at System.ThrowHelper.ThrowInvalIDOperationException(ExceptionResource
resource)at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
at System.Collections.Generic.List`1.Enumerator.MoveNext()
at Tavisca.TravelNxt.Shared.EntitIEs.StateBag.GetValue(List`1 stateBagList,String name)
@no我试过以下代码,但仍然有异常
码:
class StateBag{ public string name; public string Value;}class Program{ static List<StateBag> _concurrent = new List<StateBag>(); static voID Main() { var sw = new Stopwatch(); try { sw.Start(); Thread thread1 = new Thread(new ThreadStart(A)); Thread thread2 = new Thread(new ThreadStart(B)); thread1.Start(); thread2.Start(); thread1.Join(); thread2.Join(); sw.Stop(); } catch (Exception ex) { } Console.Writeline("Average: {0}",sw.ElapsedTicks); Console.ReadKey(); } private static Object thisLock = new Object(); public static string GetValue(List<StateBag> stateBagList,string name) { string retValue = string.Empty; if (stateBagList != null) { lock (thisLock) { foreach (StateBag stateBag in stateBagList) { if (stateBag.name.Equals(name,StringComparison.InvariantCultureIgnoreCase)) { retValue = stateBag.Value; } } } } return retValue; } static voID A() { for (int i = 0; i < 5000; i++) { _concurrent.Add(new StateBag() { name = "name" + i,Value = i.ToString() }); } } static voID B() { for (int i = 0; i < 5000; i++) { var t = GetValue(_concurrent,"name" + i); } }}解决方法 Getting Collection was modifIEd; enumeration operation may not execute. exception
原因:当您循环的枚举在同一个线程或其他某个线程中被修改时,会发生此异常.
现在,在您提供的代码中,没有任何此类方案.这意味着您可能在多线程环境中调用它,并且在其他一些线程中修改了集合.
解决方案:在枚举上实现锁定,以便一次只能访问一个线程.这样的事情应该做到这一点.
private static Object thisLock = new Object();public static string GetValue(List<StateBag> stateBagList,string name){ string retValue = string.Empty; if (stateBagList != null) { lock(thisLock) { foreach (StateBag stateBag in stateBagList) { if (stateBag.name.Equals(name,StringComparison.InvariantCultureIgnoreCase)) { retValue = stateBag.Value; } } } } return retValue;} 总结 以上是内存溢出为你收集整理的c# – 获取集合已被修改;枚举 *** 作可能无法执行.例外全部内容,希望文章能够帮你解决c# – 获取集合已被修改;枚举 *** 作可能无法执行.例外所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)