如何访问&使用在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;
  }
   } 

如何访问&使用在WPF中不同线程上创建的对象

你可以使用调用,或者你可以创建一个"存储类"(我认为它被称为一个单例,但我不确定)重用相同的实例跨几个类和/或线程像这样。

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;
}