在不同的线程中创建画布

时间:2013-10-14 22:25:23

标签: c# wpf multithreading

我编写了一个库,可以进行一些繁重的布局和图形渲染。使用抽象层我可以改变图形本身的实际创建方式(GDI,HTML5等)。一种实现将不同的形状(路径,矩形)和控件(TextBlock)添加到画布并定位它们。画布中通常会创建大约3000-5000个孩子。

现在我的实际问题:如果我从WPF窗口打开文件并同步处理图形,UI将阻止。我的目标是在不同的线程上创建WPF树(canvas + children),并在渲染后立即将其添加到主窗口。简单的第一个想法,但使用WPF的问题,因为它需要在UI线程上创建所有控件。

我想问一下如何在另一个线程上构建画布的常用方法。我已经读过创建freezable对象的可能性,冻结它们并在之后将它们传递给主UI。问题是:TextBlock类不能被冻结,这仍然需要迭代和处理数千个对象。

我的最后一个解决方案是在我的抽象层中构建普通的XAML字符串,并在UI线程中使用XamlParser

我希望有人能给我一些提示,以解决这个问题。

1 个答案:

答案 0 :(得分:0)

您可以在非UI线程中创建UI元素,但这很困难,可能不值得付出努力。 WPF对于大量的几何对象效率不是很高效,一般来说......这里有一些想法:

  • 在后台线程中使用GDI并在UI控件中绘制结果图像
  • 使用WriteableBitmap(扩展名为this
  • 创建您自己的控件,覆盖OnRender并尝试将所有内容直接绘制到drawingcontext
  • 使用SlimDx或SharpDx或您自己的托管C ++)和D3dImage使用DirectX渲染内容