WPF/背景工作者和Bitmapsource问题
-
22-09-2019 - |
题
我是WPF的初学者,并尝试一个家庭项目来熟悉该技术。我有一个简单的表单,用户选择图像文件,然后显示Exif数据以及图像的缩略图。这很好,但是当我选择一个原始图像文件(〜9 MB)时,拇指加载时可能会稍有延迟,因此我认为我可以使用后台工作人员来解码图像,并且用户可以查看EXIF数据,然后将图像解码后显示。
BitMapsource对象在后台工作人员陶库方法中声明:
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;
};
我遇到的问题是,当我尝试在runworkercomplet的方法中设置图像控件的来源时,我会收到错误,因为该对象由另一个线程所有。
worker.RunWorkerCompleted += delegate(object s, RunWorkerCompletedEventArgs args)
{
imgThumb.Source = args.Result as BitmapSource;
};
我尝试使用 imgThumb.Dispatcher.BeginInvoke()
设置源的方法,但这也不起作用,我想是因为这是 args.Result
那是另一个线程所有的,而不是 imgThumb
?我该如何解决这个问题?
可能是我错误地编码了调度器(以下是记忆,我删除了我的所拥有的)。
imgThumb.Dispatcher.Invoke(new Action<BitmapSource>(
delegate(BitmapSource src)
{
imgThumb.Source = src;
}
), bmpSource);
欢迎任何建议或想法。
更新
更改了我的Dowork方法来使用bitmapcreateoptions.none而不是.delayCreation,但是现在加载RAW文件时我会遇到以下错误(canon .cr2文件是我迄今已测试的所有内容),该代码适用于JPG。这是我安装的佳能编解码器以允许我显示原始文件的问题吗?
该应用程序称为一个接口,该界面已为另一个线程编辑。 (Hresult的例外:0x8001010E(rpc_e_wrong_thread))
解决方案
在BitMapsource上调用freeze(),您将不会遇到此问题(冻结会摆脱螺纹限制,但使对象不可变)
其他提示
不隶属于 StackOverflow