Net Core教程

C#针对使用List在添加、修改和输出时存在的“集合已修改,可能无法执行枚举操作”问题解决方法

本文主要是介绍C#针对使用List在添加、修改和输出时存在的“集合已修改,可能无法执行枚举操作”问题解决方法,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!


当使用List在添加、修改和输出时存在的“集合已修改,可能无法执行枚举操作”问题,本文参考其他作者的代码,做出的一个解释示例,仅做为学习交流使用。
转发请标注原文地址。。。。
------------------------------------------
定义一个int类型的空List

private static List<int> list = new List<int>();


创建一个控制台的空项目,在Program.cs内更改以下内容

namespace TestConsole
{
    class Program
    {

        private static List<int> list = new List<int>();//非线程安全,“集合已修改;可能无法执行枚举操作。”
                                                        //private static ConcurrentBag<int> list = new ConcurrentBag<int>();
        static void Main(string[] args)
        {
            try
            {
                ThreadSafetyTest();
                Console.ReadKey();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.StackTrace + " " + ex.Message);
            }
        }
    }
}

 

定义一个函数--- ThreadSafetyTest();新建一个name为 t 的Task,后台以一秒为周期往list里面添加count++的值;再新建一个Task将list的值输出;

#region 线程安全之ConcurrentBag 验证
private static void ThreadSafetyTest()
{
    int count = 0;
    Task t = new Task(() =>
    {
        while (true)
        {
            Thread.Sleep(1000);
            count++;
            list.Add(count);
        }
    });
    t.Start();
    Task.Run(() =>
    {
        while (true)
        {
            foreach (var item in list)
            {
                Thread.Sleep(1000);
                Console.WriteLine($"{list.Count}");
            }
        }
    });
}
#endregion


出现以下错误

 

 


解决方法:用ConcurrentBag<T>代替原来的List<T>;ConcurrentBag<T>为  对象的线程安全的无序集合

//private static List<int> list = new List<int>();//非线程安全,“集合已修改;可能无法执行枚举操作。”
private static ConcurrentBag<int> list = new ConcurrentBag<int>();


运行结果如下:

 

此处为List<T>存储方式,为顺序存储;ConcurrentBag<T>为逆序存储

 

 此处为ConcurrentBag<T>,逆序存储;而List<T>存储方式,为顺序存储;

 

 

这篇关于C#针对使用List在添加、修改和输出时存在的“集合已修改,可能无法执行枚举操作”问题解决方法的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!