其他分享
首页 > 其他分享> > 不能从另一个线程访问对象

不能从另一个线程访问对象

作者:互联网

我了解这已在其他问题上进行了讨论,但是我在这里拔头发-显然缺少明显的内容.我会尽力为您提供一些背景信息,所以这里…

我有一个冻结的UI线程,因此我创建了一个后台工作程序来完成所有繁重的处理,以保持UI的交互性.

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

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

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

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

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

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

但是我不确定自己的工作是否正确,并且调用Dispatcher的各种方法要么不执行任何操作,要么锁定BeginInvoke()上的所有内容.

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

解决方法:

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

标签:multithreading,dispatcher,backgroundworker,wpf,c
来源: https://codeday.me/bug/20191031/1976929.html