繁体   English   中英

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

[英]How to access & use an object which has been created on a different thread in WPF

我遇到以下情况,我需要像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或创建一个“存储类”(我认为它称为单例,但我不确定)可以在多个类和/或此类线程中重用同一实例。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM