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

时间:2013-05-30 14:13:19

标签: c# wpf multithreading prism

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

同样,当有人点击File \ Info面板时,我还想在我的应用程序中显示我的数据呈现部分的预览。为此我已经编写了一个方法来获取我的应用程序的预览或截图,但该方法需要一些时间所以当有人点击文件菜单然后应用程序挂起一段时间。所以,我试图使用后台工作程序以及普通的线程机制在不同的线程上调用该方法。但问题是我在不同的线程上调用它返回一个图像源对象的方法,当我尝试在运行工作者完成后台工作的事件上访问该对象时,它显示一个异常,就像这个对象的所有者是一个不同的线程表示已在不同的线程上创建了返回的图像,因此我无法使用它。那么,在我的案例中获取和使用该图像的优化方法是什么。

代码往往是这样的。

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

1 个答案:

答案 0 :(得分:0)

你可以使用invoke,或者你可以创建一个“存储类”(我认为它叫做单例,但我不确定)在几个类和/或类似的线程中重用相同的实例。

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