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

C# 如何访问&;使用在WPF中的不同线程上创建的对象,c#,wpf,multithreading,prism,C#,Wpf,Multithreading,Prism,我有以下场景,我需要在我的应用程序中显示预览选项,就像ms word所做的一样。单击“文件”菜单项下的“信息”选项时,将显示文档预览 同样,当有人单击“文件\信息”面板时,我还希望在应用程序中显示数据渲染部分的预览。为此,我写了一个方法,可以获取我的应用程序的预览或屏幕截图,但是这个方法需要一些时间,所以当有人点击文件菜单时,应用程序会挂起一段时间。所以,我尝试在不同的线程上使用后台工作线程和普通线程机制调用该方法。但问题是,我在不同线程上调用的方法返回一个图像源对象,当我试图在后台工作程序的运

我有以下场景,我需要在我的应用程序中显示预览选项,就像ms word所做的一样。单击“文件”菜单项下的“信息”选项时,将显示文档预览

同样,当有人单击“文件\信息”面板时,我还希望在应用程序中显示数据渲染部分的预览。为此,我写了一个方法,可以获取我的应用程序的预览或屏幕截图,但是这个方法需要一些时间,所以当有人点击文件菜单时,应用程序会挂起一段时间。所以,我尝试在不同的线程上使用后台工作线程和普通线程机制调用该方法。但问题是,我在不同线程上调用的方法返回一个图像源对象,当我试图在后台工作程序的运行工作程序完成事件中访问该对象时,然后它显示了一个异常,比如这个对象的所有者是另一个线程,这意味着返回的图像是在另一个线程上创建的,因此我不能使用它。那么,在我的例子中,获取和使用该图像的最佳方式是什么呢

代码往往是这样的

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

您可以使用invoke,也可以创建一个“存储类”(我认为它被称为singleton,但我不确定)跨多个类和/或线程重用同一实例,如下所示

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