Multithreading 使用“时,并非所有项目都是图纸”;平行。对于;
我正在构建一个桌面应用程序,它在绘图区域打印一系列矩形。 此应用程序是使用MONO C#构建的 我使用正常的“FOR”循环没有问题,我得到了预期的结果 Flowing是我使用normal FOR循环时的输出 当我使用普通并行For循环时,Flowing是输出 正如我们所见,一些矩形在两者之间缺失 我使用ConcurrentQueue保存创建的矩形,并将相同的队列传递给其他函数,以便在绘图区域中打印它 下面是代码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
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已编辑-现在有意义了吗?