2012-07-29 38 views
2

当尝试使用在ThreadPool线程上创建的BitmapImage实例设置图像时,出现“无效的跨线程访问”异常。使用在线程池线程上创建的BitmapImage

事实证明,我不得不在UI线程上创建BitmapImage实例。但是,生成BitmapImage非常耗时(需要100ms甚至更长时间,这里只是为了演示目的从文件中加载),这就是为什么我想在ThreadPool线程上执行它。

如果我在UI线程上实例化BitmapImage实例,并将引用传递给ThreadPool线程来操作它(如设置像素),我必须返回UI线程才能访问BitmapImage,这会冻结UI线程,这正是我想要避免的。

对此提出建议?

private void MainWindow_Loaded(object sender, RoutedEventArgs e) 
    { 
     ThreadPool.QueueUserWorkItem((o) => 
     { 
      var bitmapImage = new BitmapImage(new Uri("default.jpg", UriKind.Relative)); 
      TryToSetImage(bitmapImage); 
     }); 
    } 

    private void TryToSetImage(object obj) 
    { 
     if (this.Dispatcher.CheckAccess()) 
     { 
      //Exception: The calling thread cannot access this object because a different thread owns it. 
      image1.Source = obj as BitmapImage; 
     } 
     else 
     { 
      this.Dispatcher.Invoke(new WaitCallback(TryToSetImage), 
       System.Windows.Threading.DispatcherPriority.Render, 
       obj); 
     } 
    } 

回答

2

你需要Freeze它创建后才能让其他线程访问。