这种从并行线程报告进展的方法是更好还是更糟糕的锁定?

时间:2016-02-02 13:39:42

标签: c# multithreading progress-bar progress

我实现了一种从并行选择报告进度的方法。它工作正常。但在查看堆栈溢出类似问题的一些答案后,我想知道我的方法是否过度或者是否有价值。

我当前的方法与不报告进度并在整个集合上执行AsParrallel一样快。但我感兴趣的是12个线程的限制。这可能会如何影响其他机器的性能。

int count = ids.Count();
const int takeValue = 12;
List<ImportantDataDecorator> parrallel = new List<ImportantDataDecorator>();
for (int i = 0; ids.Count > 0; i += takeValue)
{
    int take = takeValue;
    if (take > ids.Count)
    {
        take = ids.Count;
    }

    var idsToProcess = ids.Take(takeValue);
    var processed = idsToProcess.AsParallel().Select(x =>
    {
        var value = GetValue(x, divBuffer, mask);

        return new ValueDecorator(value, x);
    }).ToList();

    parrallel.AddRange(processed);
    ids.RemoveRange(0, take);


    int remaining = i;
    float percent = (remaining/(float)count) * 100.0f;

    if (backgroundWorker != null)
    {
        backgroundWorker.ReportProgress((int) percent);

        if (backgroundWorker.CancellationPending)
            return;
    }

}

1 个答案:

答案 0 :(得分:1)

拆分工作并报告进度似乎并没有占用太多的计算时间。但该应用程序正在做一些(即使很少)工作。

  

我目前的方法与不报告进度和做法一样快   整个集合中的AsParrallel

您可以使用更大的数据尝试您的方法,并对这两种策略进行基准测试并选择更好的策略。

然而,拆分处理和执行报告返回进度的其他工作将花费您一些额外的时间(对于非常大的数据,这将是显而易见的)。您应该决定Progress报告是否为您的应用程序增加了值,以弥补额外的时间。

AsParallel()取决于各种因素,例如计算负载,系统核心数等。这种特殊方法可能在您的系统中运行得更快,在计算能力更低的系统上表现更差。
请参阅此链接以加快PLINQ:https://msdn.microsoft.com/en-us/library/dd997399(v=vs.110).aspx