我编写了以下代码以使用并行处理:
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)