c# - 使用在 Threadpool 线程上创建的 BitmapImage

标签 c# wpf multithreading

尝试使用在 ThreadPool 线程上创建的 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);
        }
    }

最佳答案

您需要Freeze创建后它可以供其他线程访问。

关于c# - 使用在 Threadpool 线程上创建的 BitmapImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11710560/

相关文章:

C# WPF 设置 F 热键

c++ - Qt在两个不同的线程中运行同一个对象的2个方法

java - Spring集成MessageQueue无需轮询

c# - 获取任务并将其传递的方法是否应该等待它?

c# - 带有查询字符串的 RouteUrl - 带有重复键

c# - 如何使用 MVVM 从 ViewModel 显示 View 并在 WPF 中设置该 View 的数据上下文

c# - 我可以以编程方式设置 app.config 'useLegacyV2RuntimeActivationPolicy' 属性吗?

java - 如何仅终止 ExecutorService 中已超时的线程?

c# - Web API 返回嵌套的 JSON 值

c# - 将数据附加到加密文件