据我所知,这已经在其他问题上进行了讨论,但我在这里拉头发 - 显然缺少一些明显的东西。我会尝试给你一些背景信息,所以这里......
我有一个冻结的UI线程,因此我创建了一个后台工作程序来执行所有繁重的处理以保持我的UI交互。
我需要为某些弧/路径生成坐标,然后我在画布上绘制。后台工作程序处理并运行它的工作完成方法,它将PathGeometry与列表中的其他一些数据一起存储。然后我使用我传递给backgroundworker的对象在我的后台工作者的UI线程中调用了update()方法。
我的问题是,当我开始在UI线程中构建Path对象(它不允许我在后台工作线程中构建它们)时,我无法访问PathGeometries。我的对象是CommunicationArc,它包含PathGeometry,不透明度,颜色等。
The calling thread cannot access this object because a different thread owns it.
我可以访问对象的其他部分,但不 PathGeometry,我不知道为什么。当workcomplete方法运行并且Arcs全部存储在我的列表中时,backgroundworker肯定已经完成了。我只是想在我的UI线程中读取弧线,稍微处理它们并继续绘制它们。
我尝试过使用我的UI线程中的Dispatcher,如下所示:
arc.pathGeometry.Dispatcher.BeginInvoke((Action)(() =>
{
MessageBox.Show(arc.pathGeometry.ToString());
}));
但是我不确定我所做的是否正确,并且调用Dispatcher的各种方法都不会执行任何操作或锁定BeginInvoke()上的所有内容。
任何帮助都会很棒,我觉得我会在这里转圈!
答案 0 :(得分:3)
您需要直接在UI线程上创建和操作几何对象。您执行的任何线程处理都无法直接访问几何对象,必须将它们分派到创建它们的线程 - UI线程。
答案 1 :(得分:1)
您正在PathGeometry
上创建background thread
个对象,因此arc.pathGeometry.Dispatcher
将为您提供Dispatcher of the background thread
,而非UI线程。
您需要将处理放在UI dispatcher
上,您可以这样做 -
App.Current.Dispatcher.BeginInvoke((Action)(() =>
{
MessageBox.Show(arc.pathGeometry.ToString());
}));