我是一个初学者,正在尝试使用WPF技术进行家庭项目以熟悉该技术。我有一个简单的表单,用户选择图像文件,然后我会显示EXIF数据以及图像的缩略图。这很好用,但是当我选择一个RAW图像文件(约9 MB)时,加载缩略图可能会有轻微的延迟,因此我认为我可以使用BackgroundWorker来解码图像,用户可以查看EXIF数据,然后当图像被解码时它会被显示。
BitmapSource对象在BackgroundWorker的DoWork方法中声明:
我遇到的问题是,在RunWorkerCompleted方法中尝试设置Image控件的源时,由于该对象归另一个线程所有,因此会收到错误提示。
我尝试使用
任何建议或想法都受欢迎。
更新
将我的DoWork方法更改为使用BitmapCreateOptions.None而不是.DelayCreation,但现在在加载RAW文件(我只测试过Canon .CR2文件)时出现以下错误,对于jpg文件,代码运行良好。这可能是我安装的用于显示RAW文件的佳能解码器的问题吗?
引用:
应用程序调用了一个为不同线程编组的接口。(HRESULT异常:0x8001010E(RPC_E_WRONG_THREAD))
BitmapSource对象在BackgroundWorker的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文件(我只测试过Canon .CR2文件)时出现以下错误,对于jpg文件,代码运行良好。这可能是我安装的用于显示RAW文件的佳能解码器的问题吗?
引用:
应用程序调用了一个为不同线程编组的接口。(HRESULT异常:0x8001010E(RPC_E_WRONG_THREAD))