使用"Parallel.For"时并非所有项目都在绘制

Vee*_*esh 1 mono multithreading monodevelop c#-4.0

我正在构建一个桌面应用程序,它在绘图区域打印一系列矩形.此应用程序使用MONO C#构建.

我使用普通的"FOR"循环没有问题,我得到了预期的结果.

当我使用普通FOR循环时,流动是输出

在此输入图像描述

当我使用普通的Parallel.For循环时,Flowing是输出

在此输入图像描述

我们可以看到其间的一些矩形缺失.

我使用ConcurrentQueue来保存创建的矩形并将相同的Queue传递给其他函数以在绘图区域上打印它.

以下是代码.

 public static void DrwaWall (DrawingArea drawArea, string compLevel)
    {
        house.Rectangle rect = new house.Rectangle ();
        house.DrawHouse DrawHouse = new house.DrawHouse ();
        ConcurrentQueue<house.Rectangle> WallHouseQ = new ConcurrentQueue<house.Rectangle> ();
        PointD p1, p2, p3, p4;
        p1 = new PointD (55, 250);
        p2 = new PointD (65, 250);
        p3 = new PointD (65, 90);
        p4 = new PointD (55, 90);
        rect = new house.Rectangle (p1, p2, p3, p4);
        WallHouseQ.Enqueue (rect);
        Parallel.For (0, 27, (i) => {
            p1.X += 10;
            p2.X += 10;
            p3.X += 10;
            p4.X += 10;
            rect = new house.Rectangle (p1, p2, p3, p4);
            Helper.wastetime (compLevel);
            WallHouseQ.Enqueue (rect);
            Gtk.Application.Invoke (delegate {
                if (drawArea == null)
                    return;
                Cairo.Context ct = Gdk.CairoHelper.Create (drawArea.GdkWindow);
                DrawHouse = new house.DrawHouse (ct, WallHouseQ);
                DrawHouse.DrawRectangles ("Wall");
                ((IDisposable)ct.Target).Dispose ();
                ((IDisposable)ct).Dispose ();
                }
            );
            }
        );
    }
Run Code Online (Sandbox Code Playgroud)

Ree*_*sey 6

您的p1/ p2/ p3/ p4变量不是线程安全的,因此您可能会覆盖现有矩形的顶部.

您可以根据当前索引计算适当的位置,而不是每次递增.例如:

Parallel.For(0, 27, i =>
{
    // Make new points...
    PointD p1New = new PointD(55 + (i+1)*10, 250);
    //...

    // Make sure you don't share variables here, either - ie: make a new rect from the new points
    house.Rectangle rectNew = new house.Rectangle (p1New, p2New, p3New, p4New);
Run Code Online (Sandbox Code Playgroud)