我是 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
? 我怎样才能绕过这个?
可能是我的 Dispatcher 编码错误(以下内容来自记忆,我删除了我拥有的内容)。
imgThumb.Dispatcher.Invoke(new Action<BitmapSource>(
delegate(BitmapSource src)
{
imgThumb.Source = src;
}
), bmpSource);
欢迎任何建议或想法。
更新
将我的 DoWork 方法更改为使用 BitmapCreateOptions.None 而不是 .DelayCreation 但现在在加载 RAW 文件时出现以下错误(我迄今为止测试过的所有文件都是佳能 .CR2 文件),该代码适用于 jpg 文件。这可能是我安装的佳能编解码器允许我显示 RAW 文件的问题吗?
应用程序调用了为不同线程编组的接口。(来自 HRESULT 的异常:0x8001010E (RPC_E_WRONG_THREAD))