我已经阅读了一些关于访问修改后的闭包的其他问题,所以我理解了基本原理。尽管如此,我还是不知道 - Parallel.ForEach 是否有同样的问题?

以我重新计算上周用户使用统计数据的以下代码段为例:

var startTime = DateTime.Now;
var endTime = DateTime.Now.AddHours(6);
for (var i = 0; i < 7; i++)
{
    // this next line gives me "Access To Modified Closure"
    Parallel.ForEach(allUsers, user => UpdateUsageStats(user, startTime, endTime));

    // move back a day and continue the process
    startTime = startTime.AddDays(-1);
    endTime = endTime.AddDays(-1);
}

根据我对这段代码的了解,foreach 应该立即运行我的 UpdateUsageStats 例程,并且开始/结束时间变量直到下一次循环才会更新。这是正确的还是我应该使用局部变量来确保没有问题?

最佳答案

访问修改后的闭包,因此它确实适用。 但是 ,您在使用它时并没有更改它的值,因此假设您没有更改 UpdateUsageStats 中的值,那么这里就没有问题。
Parallel.Foreach 等待执行结束,然后才更改 startTimeendTime 中的值。

10-08 14:49