2012-07-29 36 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它創建後才能讓其他線程訪問。