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