我编写了这段代码以便使用并行处理:
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()
之后,但这似乎不是一个好主意。我有什么选择?
答案 0 :(得分:3)
您正在将迭代索引用于闭包:
Task.Run(() => charge[i].Subscribe());
您必须将其复制到本地值:
var localI = i;
Task.Run(() => charge[localI].Subscribe());
你也可以使用Parallel
类来摆脱任务创建,正如@Bauss建议的那样(我假设你已经实例化了你的数组charge
变量)(代码更新为{{1}用法):
return
您也可以删除检查布尔条件:
Parallel.ForEach(charge, (c) =>
{
var status = c.GetSubscribeInformation();
if (!status)
{
return;
}
c.Subscribe();
// some other code here
});
与:
相同if (status == false)