【问题标题】:How to avoid the class rewritten in multi thread processing?如何避免在多线程处理中重写类?
【发布时间】:2016-05-27 18:24:07
【问题描述】:

我编写这段代码是为了使用并行处理:

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(() =&gt; charge[i].Subscribe()); 执行之前i 值发生变化并导致错误。我怎样才能避免这种情况?
我可以等到Task.Run() 之后,但这似乎不是一个好主意。我有什么选择?

【问题讨论】:

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


【解决方案1】:

您正在将迭代索引用于闭包:

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

你必须把它复制到本地值:

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

您还可以使用Parallel 类摆脱任务创建,正如@Bauss 建议的那样(我在这里假设您已经实例化了您的数组charge 变量)(针对return 用法更新了代码):

Parallel.ForEach(charge, (c) => 
{
    var status = c.GetSubscribeInformation();
    if (!status)
    {
        return;
    }
    c.Subscribe();
    // some other code here
});

您也可以取消对布尔条件的检查:

if (status == false)

等同于:

if (!status)

【讨论】:

  • 智能。谢谢男人。我应该改用 Parallel.for 吗?
  • @Dan 为Parallel.Foreach 添加了一些示例代码,Parallel.For 在使用上完全一样。
  • 非常感谢。为什么我不能使用继续?这对我来说很重要。
  • 这段代码作为一个单独的方法运行,所以你应该使用return,而不是继续。我已经更新了代码
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多