我正在开发一个 C# WPF 应用程序,它加载大量图像并将其显示为缩略图。我想以多线程的方式来做。因此我尝试实现一个BackgroundWorker。
BackgroundWorker的DoWork()的代码:
string[] files = e.Argument as string[];
foreach (string file in files)
{
ImageModel image = new ImageModel();
image.FilePath = file;
_importWorker.ReportProgress(1, image);
_imageCollectionVM.Images.Add(image); // also tried this one in ReportProgress()
}
在我的 XAML 代码中,我绑定到 ImageModel 的 BitmapImage 属性。 (AsyncState=True 没有帮助。)这里我收到此错误:“DependencySource”和“DependencyObject”必须位于同一线程中。
<Image Source="{Binding BitmapImage}" />
如果我注释掉这一点,图像似乎已导入,但我无法访问它,例如通过在 ListView 中选择它。在其 SelectionChanged 中,它表示该对象已被另一个线程占有。
我该如何解决这些问题?提前致谢!
您必须将对 GUI 的更新编组到主线程。基本上,您只能多线程从磁盘加载图像,但 GUI 的实际更新必须以单线程完成。
有很多方法可以做到这一点,并且 stackoverflow 上的许多问题都解决了这个问题。这里有一些可以帮助您入门的内容
从后台线程更新 UI https://stackoverflow.com/questions/7959005/update-ui-from-background-thread
从后台线程更新 BindingList? https://stackoverflow.com/questions/3587032/update-bindinglist-from-a-background-thread
从后台 C# 线程更新 pictureBox 是邪恶的吗? https://stackoverflow.com/questions/6527825/is-it-evil-to-update-a-picturebox-from-a-background-c-sharp-thread
如何为此使用 BindingList
如何从后台线程正确更新数据绑定 datagridview https://stackoverflow.com/questions/455766/how-do-you-correctly-update-a-databound-datagridview-from-a-background-thread
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)