[英]WPF - Draw multiple Rectangles on Canvas in parallel
我有類 BBox,它代表矩形 - 它包含矩形的坐標(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(() =>運行它或使用 new Thread運行它,如下所述:
Thread t = new Thread(delegate ()
{
Parallel.ForEach(FoundBoxes, box =>
{
...same method body...
});
});
t.SetApartmentState(ApartmentState.STA);
t.IsBackground = true;
t.Start();
但它仍然拋出提到的異常。 我該如何解決這個問題? 或者有沒有更好/更有效的方法在畫布上繪制多個對象? 謝謝你。
好吧,我按照克萊門斯的建議使用WriteableBitmapEx解決了我的問題。 現在,實時繪制了 4000 多個框。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.