Parallel.ForEach如何检查进程?

时间:2014-01-17 21:59:26

标签: c# parallel-processing

我正在使用Parallel.ForEach来完成大量工作。

我想知道这个过程是怎么回事。

所以目前我写道:

int processCnt=0;
Parallel.ForEach(allJobs, myPallOption, (oneJob) =>
    {
      processCnt++;
      Console.WriteLine("Job#"+processCnt+"/"+totalCnt);
      doJob(oneJob);
    }

但我认为processCnt++;会以某种方式锁定,这可能不是一个好主意。 这可能会减慢这个过程。

那么有没有更好的方法来了解已经完成了多少工作?

我并不关心processCnt的准确性, 我只想要更高的速度。我认为processCnt++的效果可能较慢。

3 个答案:

答案 0 :(得分:0)

怎么样:

int processCnt=0;
Parallel.ForEach(allJobs, myPallOption, (oneJob) =>
    {
      var currentCount = Interlocked.Increment(ref processCnt);
      Console.WriteLine("Job#"+currentCount+"/"+totalCnt);
      doJob(oneJob);
    }

通过使用局部变量'currentCount',您可以确保在本地增量和将其写入控制台之间不会更改'processCnt'。

答案 1 :(得分:0)

processCnt++;替换为Interlocked.Increment(ref processCnt);

由于使用[ref],您无需将结果分配给另一个变量。

答案 2 :(得分:0)

要专门解答您的问题:++运算符不是设计为线程安全的,因此不会产生额外费用。但它会产生错误的结果。 Interlocked.Increment(如其他答案所示)更好,它是正确的,如果它仍然不是很昂贵。方式比实际锁更便宜。

Interlocked.Increment很便宜,因为它可以使用特殊的CPU指令实现,该指令在该指令的时间内冻结所有其他内核。