3

我知道这已经在其他问题上进行了讨论,但我在这里把头发拉出来——显然遗漏了一些明显的东西。我会尽量给你一些背景信息,所以这里......

我有一个正在冻结的 UI 线程,所以我创建了一个后台工作程序来执行所有繁重的处理以保持我的 UI 交互。

我需要为一些弧/路径生成坐标,然后在画布上绘制。后台工作人员处理并运行它的工作完成方法,它将 PathGeometry 与其他一些数据一起存储在一个列表中。然后,我在我的 UI 线程中调用了一个 update() 方法,从我的 backgroundworker,使用我传递给 backgroundworker 的对象。

我的问题是,当我开始在 UI 线程中构建 Path 对象(它不允许我在后台工作线程中构建它们)时,我无法访问 PathGeometries。我的对象是一个 CommunicationArc,它包含 PathGeometry、不透明度、颜色等。

The calling thread cannot access this object because a different thread owns it.

我可以访问对象的其他部分,但不能访问 PathGeometry,我不知道为什么。随着 workcomplete 方法的运行,backgroundworker 肯定已经完成,并且 Arcs 都存储在我的列表中。我只是想在我的 UI 线程中读取弧线,对它们进行更多处理,然后继续绘制它们。

我曾尝试使用我的 UI 线程中的 Dispatcher,如下所示:

arc.pathGeometry.Dispatcher.BeginInvoke((Action)(() =>
            {
                MessageBox.Show(arc.pathGeometry.ToString());
            }));

但是我不确定我所做的是否正确,调用 Dispatcher 的各种方法要么不做任何事情,要么将所有内容锁定在 BeginInvoke() 上。

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

4

2 回答 2

3

您需要直接在 UI 线程上创建和操作几何对象。您执行的任何线程处理都不能直接访问几何对象,它们必须被分派到创建它们的线程 - UI 线程。

于 2012-11-26T01:10:51.540 回答
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());
}));
于 2012-11-26T06:56:24.970 回答