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 多个框。