考虑我的以下(简化)代码:
public double ComputeSum(List<double> numbers, ref double threshold, Object thresholdLock)
{
double sum = 0;
Object sumLock = new Object();
Parallel.ForEach (numbers, (number) =>
{
bool numberIsGreaterOrEqualThanThreshold;
lock (thresholdLock)
{
numberIsGreaterOrEqualThanThreshold = number >= threshold;
}
if (numberIsGreaterOrEqualThanThreshold)
{
lock (sumLock)
{
sum += number;
}
}
});
return sum;
}
此代码无法编译。编译器错误信息是:
不能在匿名方法、lambda 表达式或查询表达式中使用 ref 或 out 参数“阈值”
此并行 ComputeSum 方法的目标是并行计算“数字”参数列表中某些数字的总和。此总和将包括所有大于或等于引用的阈值 ref 参数的数字。
这个阈值参数作为 ref 传递,因为它可以在 ComputeSum 方法执行期间被其他一些任务修改,并且我需要在与阈值进行比较时将每个数字与当前阈值进行比较。(我知道,在这个简化的示例中,这样做可能看起来很愚蠢,但实际代码更复杂且更有意义)。
我的问题是:我可以使用什么解决方法通过 Parallel.ForEach lambda-expression 语句中的 ref 访问阈值?
注意:我阅读了“说重复”问题Cannot use ref or out parameter in lambda expressions但我不是问为什么编译器拒绝这个 ref 参数访问,而是我要求一种解决方法来做我打算做的事情.