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