为什么Parallel.For与循环一样正常?

时间:2015-02-05 08:54:27

标签: c# multithreading parallel-processing

我有问题。我想使用Parallel.For循环,它应该花费15秒。

例如:

AForge.Parallel.For(0, 2, delegate(int i)
{
    if (i == 0)
    {
        resim.Morphology(MorphologyMethod.HitAndMiss, kernel1);
        resim.Write("sag.bmp");
        label2.Text = DateTime.Now.ToString();
    }
    else if (i == 1)
    {
        resim2.Morphology(MorphologyMethod.HitAndMiss, kernel2);
        resim2.Write("sol.bmp");
        label3.Text = DateTime.Now.ToString();
    }
});

如果我不使用并行,则需要30秒。如果我使用并行,它应该花费15秒,但Parallel.For不起作用。当我使用并行时花费30秒。我不明白。

2 个答案:

答案 0 :(得分:0)

一个问题是您无法从非UI线程访问GUI控件(label2和lable3)。这会生成Exception。尝试删除这两行,看看会发生什么。

此外,由于AForge是CPU密集型的,因此您需要在具有多个CPU的计算机上进行测试。

感谢Aron

这将强制任务在不同的线程上运行。

var t1 = Task.Run(() =>
{
    resim.Morphology(MorphologyMethod.HitAndMiss, kernel1);
    resim.Write("sag.bmp");
});
var t2 = Task.Run(() =>
{
    resim.Morphology(MorphologyMethod.HitAndMiss, kernel2);
    resim.Write("sol.bmp");
});
Task.WaitAll(new Task[] { t1, t2 });

答案 1 :(得分:0)

以下是 Parallel.For MSDN页面的摘录:

  

执行可在其中运行迭代的for(For in Visual Basic)循环   并行。

关键词是可能,这实际上意味着它不能保证并行运行,即使它并行运行也无法保证性能与平原相比会更好顺序代码,所以你期望Parallel运行速度提高2倍是错误的。

此外,您正在从UI线程上运行的并行循环更新UI控件,这不是一个好主意。以下是MSDN的另一段摘录:

  

尝试在UI线程上执行的并行循环内更新UI控件可能会导致状态损坏,异常,延迟更新甚至死锁,具体取决于调用UI更新的方式。