使用PLINQ时创建线程安全变量

时间:2017-01-16 14:47:39

标签: c# asp.net asp.net-mvc multithreading thread-safety

我有一个项目列表,我通过这些项目循环使用PLINQ语句来增加特定用户的总收入,如下所示:

data.groupby("salary_percentile").early_quitter.value_counts(normalize = True)
Out:
    salary_percentile  early_quitter
[17000, 25000]     0                0.744526
                   1                0.255474
(25000, 30000]     0                0.751880
                   1                0.248120
(30000, 38000]     0                0.701799
                   1                0.298201
(38000, 46000]     0                0.772118
                   1                0.227882
(46000, 53000]     0                0.742015
                   1                0.257985
(53000, 57000]     0                0.720339
                   1                0.279661
(57000, 61000]     0                0.745763
                   1                0.254237
(61000, 64000]     0                0.688144
                   1                0.311856

通过这样使用它,我总是得到一个不同的价值。我相信这是因为声明的变量不是线程安全的。我该如何解决这个问题?

P.S。 _SortedList是一个通用集合(List<>)...

1 个答案:

答案 0 :(得分:6)

使用Sum获取使用PLINQ的总数。它将有效且安全地汇总总和。

double TotalEarnings = _SortedList.AsParallel()
    .WithDegreeOfParallelism(5)
    .Sum(item => item.SaleEarning);