WPF-在画布上并行绘制多个矩形

问题描述 投票:0回答:1

我有BBox类,代表Rectangle-它包含坐标(x,y,宽度,高度)和矩形的颜色。然后我有这些BBox的列表,其中包含大约4000个。我需要尽快绘制所有存储在画布上的列表中的框。最有效的方法是什么?

    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(()=>]运行它,或使用新的[[Thread运行它,如下所述:

Thread t = new Thread(delegate () { Parallel.ForEach(FoundBoxes, box => { ...same method body... }); }); t.SetApartmentState(ApartmentState.STA); t.IsBackground = true; t.Start();
但是它仍然会抛出所提到的异常。我该如何解决?还是有更好/更有效的方法在画布上绘制多个对象?谢谢。
c# wpf parallel-processing drawing
1个回答
0
投票
[好吧,我按照Clemens的建议使用WriteableBitmapEx解决了我的问题。现在,可以实时绘制4000多个框。
© www.soinside.com 2019 - 2024. All rights reserved.