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