WPF - 在 Canvas 上并行绘制多个矩形
WPF - Draw multiple Rectangles on Canvas in parallel
我有 class BBox,它代表矩形 - 它包含矩形的坐标(x、y、宽度、高度)和颜色。然后我有这些 BBoxes 的列表,其中包含大约 4000 个。我需要尽快绘制存储在 Canvas 上的列表中的所有框。最有效的方法是什么?
private List<BBox> FoundBoxes { get; set; }
public void DrawBoxes(Canvas canvas)
{
foreach (var box in FoundBoxes)
{
var brush = box.getColor();
System.Windows.Shapes.Rectangle rect;
rect = new System.Windows.Shapes.Rectangle
{
Stroke = brush,
Height = box.Height,
Width = box.Width,
StrokeThickness = 1
};
Canvas.SetLeft(rect, box.TopLeftX);
Canvas.SetTop(rect, box.TopLeftY);
canvas.Children.Add(rect);
}
}
上面的代码需要超过 1 秒,这对我的应用程序来说很慢。我确信必须有一种方法可以并行进行。所以我尝试了这个:
Parallel.ForEach(FoundBoxes, box =>
{
...same method body...
});
但它抛出
System.InvalidOperationException: 'The calling thread must be STA, because many UI components require this.'
我知道为什么会出现此异常,并且我试图找到解决方案,但对我来说没有任何效果。例如,我尝试 运行 使用 Dispatcher.Invoke(() => 或 运行 使用 new Thread 如此处所述:
Thread t = new Thread(delegate ()
{
Parallel.ForEach(FoundBoxes, box =>
{
...same method body...
});
});
t.SetApartmentState(ApartmentState.STA);
t.IsBackground = true;
t.Start();
但它仍然抛出上述异常。我该如何解决这个问题?或者有没有更好/更有效的方法在 canvas 上绘制多个对象?谢谢。
好吧,我按照 Clemens 的建议使用 WriteableBitmapEx 解决了我的问题。现在,实时绘制了 4000 多个框。
我有 class BBox,它代表矩形 - 它包含矩形的坐标(x、y、宽度、高度)和颜色。然后我有这些 BBoxes 的列表,其中包含大约 4000 个。我需要尽快绘制存储在 Canvas 上的列表中的所有框。最有效的方法是什么?
private List<BBox> FoundBoxes { get; set; }
public void DrawBoxes(Canvas canvas)
{
foreach (var box in FoundBoxes)
{
var brush = box.getColor();
System.Windows.Shapes.Rectangle rect;
rect = new System.Windows.Shapes.Rectangle
{
Stroke = brush,
Height = box.Height,
Width = box.Width,
StrokeThickness = 1
};
Canvas.SetLeft(rect, box.TopLeftX);
Canvas.SetTop(rect, box.TopLeftY);
canvas.Children.Add(rect);
}
}
上面的代码需要超过 1 秒,这对我的应用程序来说很慢。我确信必须有一种方法可以并行进行。所以我尝试了这个:
Parallel.ForEach(FoundBoxes, box =>
{
...same method body...
});
但它抛出
System.InvalidOperationException: 'The calling thread must be STA, because many UI components require this.'
我知道为什么会出现此异常,并且我试图找到解决方案,但对我来说没有任何效果。例如,我尝试 运行 使用 Dispatcher.Invoke(() => 或 运行 使用 new Thread 如此处所述:
Thread t = new Thread(delegate ()
{
Parallel.ForEach(FoundBoxes, box =>
{
...same method body...
});
});
t.SetApartmentState(ApartmentState.STA);
t.IsBackground = true;
t.Start();
但它仍然抛出上述异常。我该如何解决这个问题?或者有没有更好/更有效的方法在 canvas 上绘制多个对象?谢谢。
好吧,我按照 Clemens 的建议使用 WriteableBitmapEx 解决了我的问题。现在,实时绘制了 4000 多个框。