c# – 获取集合已被修改;枚举 *** 作可能无法执行.例外

c# – 获取集合已被修改;枚举 *** 作可能无法执行.例外,第1张

概述收集被修改;枚举 *** 作可能无法执行.例外 码: public static string GetValue(List<StateBag> stateBagList, string name){ string retValue = string.Empty; if (stateBagList != null) { foreach (StateBag stat 收集被修改;枚举 *** 作可能无法执行.例外

码:

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# – 获取集合已被修改;枚举 *** 作可能无法执行.例外所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1237238.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存