列表中的C#Parallel.Foreach int[];T>;未正确更改

列表中的C#Parallel.Foreach int[];T>;未正确更改,c#,parallel.foreach,C#,Parallel.foreach,这是我的班级: 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 st

这是我的班级:

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
    {
        //
    }
});
列表
预先填充了数据。开始foreach之前,月份数组为[0,0,0,0,0,0,0,0,0,0],且
int[]arr_Month=new int[12]

tmp
也是一个
列表

什么不起作用:在循环过程中,计数以及
项的值。月[月]
是正确的。但不在目标
列表中。所有月份都是循环中处理的最后一个计数的相同值,例如[3,0,3,0,0,0,0,0,0,0,0]或[0,1,1,0,0,0,0,0,0,0,0]。因为平行,结果总是不同的

我将
int[]
更改为
公共字典月{get;set;}
进行测试,但行为相同

下面是示例代码(带有//第二个try with dictionary,结果相同):

公共类未使用的角色
{
公共字符串用户名{get;set;}
公共字符串角色{get;set;}
公共整数月{get;set;}
}
公共类未使用角色发生
{
公共字符串用户名{get;set;}
公共字符串角色{get;set;}
//公共字典月份{get;set;}
public int[]月{get{return Month;}集{Month=value;}}
公共整数[]月=新整数[12];
}
public List unusedroles=新列表();
public List unusedrolesoccurrence=新列表();
公共表格1()
{
初始化组件();
}
私有无效按钮1\u单击(对象发送者,事件参数e)
{
Run();
}
公共异步无效运行()
{
unusedroles.Clear();
未使用的角色发生。清除();
Dictionary Dictionary_month=新字典();
//对于(inti=0;i<12;i++){dictionary\u month.Add(i,0);}
整数[]arr_月=新整数[12];
添加(新的unusedroles{Username=“User1”,Role=“A”,Month=0});
添加(新的unusedroles{Username=“User1”,Role=“A”,Month=0});
添加(新的unusedroles{Username=“User1”,Role=“B”,Month=0});
添加(新的unusedroles{Username=“User2”,Role=“A”,Month=0});
添加(新的unusedroles{Username=“User2”,Role=“B”,Month=0});
添加(新的unusedroles{Username=“User2”,Role=“B”,Month=0});
添加(新的unusedroles{Username=“User3”,Role=“C”,Month=0});
添加(新的unusedroles{Username=“User3”,Role=“C”,Month=0});
添加(新的unusedroles{Username=“User3”,Role=“C”,Month=0});
添加(新的unusedroles{Username=“User4”,Role=“A”,Month=0});
var tmp=unusedroles.Select(x=>new{x.Username,x.Role}).Distinct();
foreach(tmp中的var项目)
{
unusedrolesoccurrence.Add(新的unusedrolesoccurrence
{
//用户名=项目。用户名,角色=项目。角色,月份=字典\月份
用户名=项目。用户名,角色=项目。角色,月份=每月
});
}
var结果=等待查找(0);
foreach(未使用角色发生的var项目)
{
//字符串行=”;
//foreach(项目月份中的var对){
//line=$“{line},{pair.Value}”;
//}
字符串行=$“{item.Username},{item.Role}”;
foreach(项目月份中的int i)
{
line=$“{line},{i}”;
}
//Debug.WriteLine($“{item.Username},{item.Role}{line}”);
Debug.WriteLine($“{line}”);
}
}
公共异步任务查找(整数月)
{
等待任务。运行(()=>
{
Parallel.ForEach(unusedrolesoccurrence,(unusedrolesoccurrence项)=>
{
int count=unusedroles.count(x=>x.Username==item.Username&&x.Role==item.Role&&x.Month==Month);
项目.月[月]=计数;
Debug.WriteLine($“{item.Username},{item.Role},count={count},item.Month[{Month}]={item.Month[Month]}”);
});
});
返回true;
}

TL;DR:您的月份数组是静态的,请不要这样做。

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

private static int[]月=new int[12]

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


注意:此代码中可能存在其他问题,但您的问题来自此问题。

它是这样工作的

之前:

        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]
        });
    }

并行中放置这样的
。ForEach
的方式几乎使它变得无用。为什么要对实例属性使用静态备份字段?不要这样做我在更新
列表时遇到问题,stackoverflow的回答是添加
@ReneM-然后向我们显示一个,以便我们可以看到它是需要的。如果你需要帮助,请告诉我。没有解决问题。同样的行为。第二次尝试使用
public Dictionary Month{get;set;}
,它是公共的,不起作用。然后,正如我所建议的,您确实存在其他问题。下一个罪魁祸首很可能是
,一旦类的成员不再是静态的,就不需要它了。假设“不起作用”意味着你有
    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]
        });
    }