我正在尝试编写一个处理流文档的后台工作人员。由于线程验证,我无法访问 flowdocument 对象的属性。我试图序列化文档并将其加载到实际上解决了线程验证问题的工作线程上。但是,一旦处理完成,我还需要使用 TextPointer 对象之类的东西。这些对象现在指向副本中的对象,而不是原始对象。
任何人都可以建议在 WPF 中处理此类后台处理的最佳方法吗?
我正在尝试编写一个处理流文档的后台工作人员。由于线程验证,我无法访问 flowdocument 对象的属性。我试图序列化文档并将其加载到实际上解决了线程验证问题的工作线程上。但是,一旦处理完成,我还需要使用 TextPointer 对象之类的东西。这些对象现在指向副本中的对象,而不是原始对象。
任何人都可以建议在 WPF 中处理此类后台处理的最佳方法吗?
您不能,只能从创建它们的线程访问 WPF 对象,因此根据定义,您不能对它们进行任何后台处理。
但是,正如您已经发现的那样,您可以使用序列化技术在另一个线程中创建一个副本,然后您可以将结果序列化回来。
XamlWriter/XamlReader 可以序列化几乎每个 WPF 对象,但在大型对象图上可能会很慢。
对于 TextPointer,也许您可以使用 GetOffsetToPosition/GetPositionAtOffset 在主线程中重新创建等效的 TextPointer。
另一种选择是使用可冻结对象,可以从其他线程使用从 Freezeable 继承的对象(在调用 Freeze 方法之后),文档不可冻结,但绘图和几何图形是可冻结的 - 因此您可以在线程之间传输文档“片段”作为图纸。