2

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

事实证明,为了避免这种情况,我必须在 UI 线程上创建 BitmapImage 实例。但是生成 BitmapImage 非常耗时(需要 100 毫秒甚至更长的时间,这里它是从文件中加载的,只是为了演示),这就是为什么我想在 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);
        }
    }
4

1 回答 1

2

Freeze在创建它以使其他线程可以访问它之后,您需要它。

于 2012-07-29T15:50:41.140 回答