如何避免在多线程处理中重写的类?

时间:2016-02-16 12:51:24

标签: c# .net multithreading wcf parallel-processing

我编写了这段代码以便使用并行处理:

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()之后,但这似乎不是一个好主意。我有什么选择?

1 个答案:

答案 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)