我有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();
但是它仍然会抛出所提到的异常。我该如何解决?还是有更好/更有效的方法在画布上绘制多个对象?谢谢。