我编写了以下代码以使用并行处理:

var charge = new Charge[Job.Jobs.Length];
for (int i = 0; i < Job.Jobs.Length; i++)
{
    charge[i] = new Charge
    {
        ID = Convert.ToInt64(Job.Jobs[i].Parameters),
        Job = new SystemJob { ID = Job.Jobs[i].ID, Type = Job.Type },
    };
    var status = charge[i].GetSubscribeInformation();
    if (status == false)
        continue;

    Task.Run(() => charge[i].Subscribe());
    //before task runs, the i value changes and causes error.
}

问题是在执行Task.Run(() => charge[i].Subscribe());之前i值更改并导致错误。如何避免这种情况?
我可以等到Task.Run()之后,但这似乎不是一个好主意。我有什么选择?

最佳答案

您正在使用迭代索引到闭包中:

Task.Run(() => charge[i].Subscribe());

您必须将其复制到本地值:
var localI = i;
Task.Run(() => charge[localI].Subscribe());

您也可以按照@Bauss的建议,使用Parallel类摆脱Task的创建(我假设您已实例化了数组charge变量)(已针对return用法更新了代码):
Parallel.ForEach(charge, (c) =>
{
    var status = c.GetSubscribeInformation();
    if (!status)
    {
        return;
    }
    c.Subscribe();
    // some other code here
});

您也可以删除对 bool 条件的检查:
if (status == false)

是相同的:
if (!status)

10-04 20:18