当前位置:  开发笔记 > 程序员 > 正文

WPF/BackgroundWorker和BitmapSource问题

如何解决《WPF/BackgroundWorker和BitmapSource问题》经验,为你挑选了1个好方法。

我是WPF的初学者,并尝试了一个熟悉该技术的家庭项目.我有一个简单的表单,用户选择一个图像文件,然后我显示EXIF数据和图像的缩略图.这工作正常但是当我选择一个RAW图像文件(~9 MB)时,拇指加载时可能会有轻微的延迟,所以我想我可以使用BackgroundWorker解码图像,用户可以查看EXIF数据,然后当图像被解码时,显示它.

BitmapSource对象在BackgroundWorkers DoWork方法中声明:

worker.DoWork += delegate(object s, DoWorkEventArgs args)
{
    string filePath = args.Argument as string;

    BitmapDecoder bmpDecoder = BitmapDecoder.Create(new Uri(filePath), BitmapCreateOptions.None, BitmapCacheOption.None);
    BitmapSource bmpSource = bmpDecoder.Frames[0];
    bmpSource.Freeze(); //As suggested by Paul Betts

    args.Result = bmpSource;
};

我遇到的问题是当我尝试在RunWorkerCompleted方法中设置我的Image控件的源时,我收到一个错误,因为该对象归另一个线程所有.

worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
    imgThumb.Source = args.Result as BitmapSource;
};

我尝试使用该imgThumb.Dispatcher.BeginInvoke()方法设置源,但这也不起作用,我想这是因为它args.Result是由另一个线程拥有,而不是imgThumb?我怎么能绕过这个?

可能是我对我的调度程序编码错误(以下内容来自内存,我删除了我的内容).

imgThumb.Dispatcher.Invoke(new Action(
    delegate(BitmapSource src)
    {
        imgThumb.Source = src;
    }
), bmpSource);

欢迎任何建议或想法.

更新

更改了我的DoWork方法以使用BitmapCreateOptions.None而不是.DelayCreation但现在我在加载RAW文件时遇到以下错误(Canon .CR2文件是我迄今为止测试的所有文件),代码适用于jpg.这可能是我安装的Canon Codec的一个问题,允许我显示RAW文件?

该应用程序调用了一个为不同线程编组的接口.(来自HRESULT的异常:0x8001010E(RPC_E_WRONG_THREAD))

Ana Betts.. 8

在BitmapSource上调用Freeze()并且你不会遇到这个问题(Freezing摆脱了线程限制,但使对象不可变)



1> Ana Betts..:

在BitmapSource上调用Freeze()并且你不会遇到这个问题(Freezing摆脱了线程限制,但使对象不可变)

推荐阅读
农大军乐团_697
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有