无法从另一个线程访问对象

时间:2012-11-26 00:40:39

标签: c# wpf multithreading backgroundworker dispatcher

据我所知,这已经在其他问题上进行了讨论,但我在这里拉头发 - 显然缺少一些明显的东西。我会尝试给你一些背景信息,所以这里......

我有一个冻结的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()上的所有内容。

任何帮助都会很棒,我觉得我会在这里转圈!

2 个答案:

答案 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());
}));