List<T> 中的 C# Parallel.Foreach int[] 未正确更改

这是我的课:


public class UnusedRolesOccurrence

{

    public string Username { get; set; }

    public string FullName { get; set; }

    public string Role { get; set; }

    public int[] Month { get { return month; } set { month = value; } }

    private static int[] month = new int[12];

}

这就是我想用值填充 int 数组的地方:


Parallel.ForEach(unusedrolesoccurrence, (UnusedRolesOccurrence item) =>

{

    try

    {

        lock (listLock)

        {


            int count = tmp.Count(x => x.Username == item.Username && x.Role == item.Role);

            item.Month[month] = count;


            if (count > 2)

            {

                Debug.WriteLine($"{item.Username},{item.Role},{month}={count},{item.Month[month]}");

            }

        }

    }

    catch

    {

        //

    }

});

List<unusedrolesoccurrence>预先填充了数据。在开始 foreach 之前,月份数组是 [0,0,0,0,0,0,0,0,0,0,0,0],使用int[] arr_month = new int[12];.


tmp也是一个List<t>。


什么不工作:在循环期间,计数和值item.Month[month]也是正确的。但不在目标中List<UnusedRolesOccurrence>。所有月份都是循环中处理的最后一个计数的相同值,例如 [3,0,3,0,0,0,0,0,0,0,0,0] 或 [0,1,1,0 ,0,0,0,0,0,0,0,0]。而且因为并行,结果当然总是不同的。


我换int[]到public Dictionary<int, int> Month { get; set; }测试,但同样的行为。


这里的示例代码(使用 // 二次尝试使用具有相同结果的字典):


public class UnusedRoles

        {

            public string Username { get; set; }

            public string Role { get; set; }

            public int Month { get; set; }

        }


        public class UnusedRolesOccurrence

        {

            public string Username { get; set; }

            public string Role { get; set; }

            //public Dictionary<int, int> Month { get; set; }

            public int[] Month { get { return month; } set { month = value; } }

            public int[] month = new int[12];

        }


        public List<UnusedRoles> unusedroles = new List<UnusedRoles>();

        public List<UnusedRolesOccurrence> unusedrolesoccurrence = new List<UnusedRolesOccurrence>();


        public Form1()

        {

            InitializeComponent();

        }


皈依舞
浏览 229回答 2
2回答

弑天下

您的月份数组是静态的,不要这样做。在您设置的并发操作期间,您的类的以下成员由该类UnusedRolesOccurrence的所有实例共享。private static int[] month = new int[12];删除 static 关键字,每个实例UnusedRolesOccurrence都会有自己的.month数组。注意:您可能在此代码中还有其他问题,但您的问题来自这里的这个问题。

牛魔王的故事

它正在以这种方式工作。前:&nbsp; &nbsp; &nbsp; &nbsp; int[] arr_month = new int[12];&nbsp; &nbsp; &nbsp; &nbsp; var tmp = unusedroles.Select(x => new { x.Username, x.Role }).Distinct();&nbsp; &nbsp; &nbsp; &nbsp; foreach (var item in tmp)&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; unusedrolesoccurrence.Add(new UnusedRolesOccurrence&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Username = item.Username, Role = item.Role, Month = dictionary_month&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Username = item.Username, Role = item.Role, Month = arr_month&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; &nbsp; &nbsp; }后:&nbsp; &nbsp; var tmp = unusedroles.Select(x => new { x.Username, x.Role }).Distinct();&nbsp; &nbsp; foreach (var item in tmp)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; unusedrolesoccurrence.Add(new UnusedRolesOccurrence&nbsp; &nbsp; &nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; //Username = item.Username, Role = item.Role, Month = dictionary_month&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Username = item.Username, Role = item.Role, Month = new int[12]&nbsp; &nbsp; &nbsp; &nbsp; });&nbsp; &nbsp; }
打开App,查看更多内容
随时随地看视频慕课网APP