Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/apache/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Multithreading 使用“时,并非所有项目都是图纸”;平行。对于;_Multithreading_C# 4.0_Mono_Monodevelop - Fatal编程技术网

Multithreading 使用“时,并非所有项目都是图纸”;平行。对于;

Multithreading 使用“时,并非所有项目都是图纸”;平行。对于;,multithreading,c#-4.0,mono,monodevelop,Multithreading,C# 4.0,Mono,Monodevelop,我正在构建一个桌面应用程序,它在绘图区域打印一系列矩形。 此应用程序是使用MONO C#构建的 我使用正常的“FOR”循环没有问题,我得到了预期的结果 Flowing是我使用normal FOR循环时的输出 当我使用普通并行For循环时,Flowing是输出 正如我们所见,一些矩形在两者之间缺失 我使用ConcurrentQueue保存创建的矩形,并将相同的队列传递给其他函数,以便在绘图区域中打印它 下面是代码 public static void DrwaWall (DrawingAre

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

我使用正常的“FOR”循环没有问题,我得到了预期的结果

Flowing是我使用normal FOR循环时的输出

当我使用普通并行For循环时,Flowing是输出

正如我们所见,一些矩形在两者之间缺失

我使用ConcurrentQueue保存创建的矩形,并将相同的队列传递给其他函数,以便在绘图区域中打印它

下面是代码

 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 ();
                }
            );
            }
        );
    }
public static void DrwaWall(DrawingArea drawArea,string compLevel)
{
house.Rectangle=newhouse.Rectangle();
house.DrawHouse DrawHouse=new house.DrawHouse();
ConcurrentQueue WallHouseQ=新的ConcurrentQueue();
点D p1、p2、p3、p4;
p1=新的点D(55250);
p2=新的点D(65250);
p3=新点D(65,90);
p4=新的点D(55,90);
矩形=新房子。矩形(p1、p2、p3、p4);
WallHouseQ.排队(rect);
对于(0,27,(i)=>{
p1.X+=10;
p2.X+=10;
p3.X+=10;
p4.X+=10;
矩形=新房子。矩形(p1、p2、p3、p4);
Helper.wastetime(compLevel);
WallHouseQ.排队(rect);
Gtk.Application.Invoke(委托{
如果(绘图区域==null)
返回;
Cairo.Context ct=Gdk.CairoHelper.Create(drawArea.GdkWindow);
客厅=新房子。客厅(ct,Wallhouse Q);
DrawHouse.Draw矩形(“墙”);
((IDisposable)ct.Target.Dispose();
((IDisposable)ct.Dispose();
}
);
}
);
}

您的
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);

您的
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);

谢谢你的回复。我明白你在第一部分想说什么。我不明白它的第二部分。能否请您详细说明或修改上述代码?再次感谢您的快速回复。@Veeresh已编辑-现在有意义吗?谢谢您的回复。我明白你在第一部分想说什么。我不明白它的第二部分。能否请您详细说明或修改上述代码?再次感谢您的快速回复。@Veeresh已编辑-现在有意义了吗?