为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

C#
皈依舞 2022-01-09 14:48:41
这是我的课: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();        }
查看完整描述

2 回答

?
弑天下

TA贡献1818条经验 获得超8个赞

您的月份数组是静态的,不要这样做。

在您设置的并发操作期间,您的类的以下成员由该类UnusedRolesOccurrence所有实例共享。

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

删除 static 关键字,每个实例UnusedRolesOccurrence都会有自己的.month数组。

注意:您可能在此代码中还有其他问题,但您的问题来自这里的这个问题。


查看完整回答
反对 回复 2022-01-09
?
牛魔王的故事

TA贡献1830条经验 获得超3个赞

它正在以这种方式工作。


前:


        int[] arr_month = new int[12];


        var tmp = unusedroles.Select(x => new { x.Username, x.Role }).Distinct();


        foreach (var item in tmp)

        {

            unusedrolesoccurrence.Add(new UnusedRolesOccurrence

            {

                //Username = item.Username, Role = item.Role, Month = dictionary_month

                Username = item.Username, Role = item.Role, Month = arr_month

            });

        }

后:


    var tmp = unusedroles.Select(x => new { x.Username, x.Role }).Distinct();


    foreach (var item in tmp)

    {

        unusedrolesoccurrence.Add(new UnusedRolesOccurrence

        {

            //Username = item.Username, Role = item.Role, Month = dictionary_month

            Username = item.Username, Role = item.Role, Month = new int[12]

        });

    }


查看完整回答
反对 回复 2022-01-09
  • 2 回答
  • 0 关注
  • 228 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号