如何使用Task.Factory.StartNew<>?保存不同的处理结果

时间:2014-11-18 07:13:31

标签: c# parallel-processing task-parallel-library parallel.foreach

我的电脑有4个处理器,我正在尝试使用Task.Factory.StartNew<>加快计算时间。我想将每个进程结果保存在EachTastResult数组中。问题是下面的代码不会单独保存每个过程结果! 当我使用&#39; Breakpoint&#39;看到'EachTastResult Array&#39;内容,我意识到Final Process结果保存在EachTastResult [0],EachTastResult [1],EachTastResult [2]和EachTastResult [3]中。虽然它应该如下:

  • EachTastResult [0] =第1个处理结果
  • EachTastResult [1] =第2个处理结果
  • EachTastResult [2] =第3个处理结果
  • EachTastResult [3] =第4个处理结果

请原谅我糟糕的英语!

var tasks = new Task[4];
var EachTastResult = new int[4];

for (var proc = 0; proc < 4; proc++)
{
int procIndex = proc;    // Helper for closure

// Start one task per processor
tasks[proc] = Task.Factory.StartNew(() =>{

var NotExist_localCounter = 0;

for (var i = ((proc - 1) * foursec) + 1 ; i <= (proc * foursec); i++)
{
    if (condition_1 ...)
        if (Condition_2 ...)
            NotExist_localCounter++;
}
EachTastResult[procIndex] = NotExist_localCounter;
}, CancellationToken.None,TaskCreationOptions.None ,TaskScheduler.Default);}

Task.WaitAll(tasks);

NotExist_1 = EachTastResult.Sum();
label6.Text=NotExist_1.ToString();

我的错误在哪里?

1 个答案:

答案 0 :(得分:0)

我认为问题在于你并没有始终如一地使用“Helper for closure”。由于每个Task使用共享的proc变量,因此您将四次计算相同的结果。