如何访问&使用在WPF中不同线程上创建的对象
本文关键字:线程 对象 创建 WPF 何访问 访问 | 更新日期: 2023-09-27 18:16:11
我有以下场景,我需要在我的应用程序中显示预览选项,如ms-word所做的。当我们点击文件菜单项下的信息选项时,就会显示文档的预览。
以同样的方式,我也想在我的应用程序中显示我的数据渲染部分的预览,当有人点击文件'信息面板。为此,我写了一个方法,它得到我的应用程序的预览或截图,但该方法需要一些时间,所以当有人点击文件菜单,然后应用程序挂了一段时间。所以,我试图调用该方法在不同的线程使用后台工作以及正常的线程机制。但事情是我在不同的线程上调用的方法,它返回一个图像源对象,当我试图访问该对象上运行worker完成后台worker事件,然后它显示一个异常,如这个对象的所有者是一个不同的线程,这意味着返回的图像已经在不同的线程上创建,因此我不能使用它。那么,在我的例子中,获取和使用图像的优化方法是什么呢?
代码往往是这样的。
public void ShowPreview()
{
ImageSource source =null;
var bgWorkerThread = new BackgroundWorker()
bgWorkerThread.DoWork +=(SENDER,ARGS)=> {
source = planView.GetPreviewImage();
}
bgWorkerThread.RunWorkerCompleted += (sender,args)=>
{
// Application crashes at this point
infoPanel.PreviewImage.source = args.Result as ImageSource;
}
}
你可以使用调用,或者你可以创建一个"存储类"(我认为它被称为一个单例,但我不确定)重用相同的实例跨几个类和/或线程像这样。
class Test
{
void main()
{
newThread nt = new newThread();
Storage store = new Storage();
nt.store = store;
Thread t = new Thread(new ThreadStart(nt.runMe));
t.Start();
}
}
public class newThread
{
public Storage store;
public void runMe()
{
store.someNum = 8;
}
}
public class Storage
{
public int someNum;
}