C# 在C中异步加载图像#
我正在开发一个C#WPF应用程序,它加载了大量图像并将其显示为缩略图。我想用多线程的方式来做。因此,我尝试实现一个BackgroundWorker BackgroundWorker的DoWork()代码: 在我的XAML代码中,我绑定到ImageModel的BitmapImage属性。(AsyncState=True没有帮助。)这里我得到了一个错误:“DependencySource”和“DependencyObject”必须在同一个线程中C# 在C中异步加载图像#,c#,wpf,multithreading,image,asynchronous,C#,Wpf,Multithreading,Image,Asynchronous,我正在开发一个C#WPF应用程序,它加载了大量图像并将其显示为缩略图。我想用多线程的方式来做。因此,我尝试实现一个BackgroundWorker BackgroundWorker的DoWork()代码: 在我的XAML代码中,我绑定到ImageModel的BitmapImage属性。(AsyncState=True没有帮助。)这里我得到了一个错误:“DependencySource”和“DependencyObject”必须在同一个线程中 <Image Source="{Binding
<Image Source="{Binding BitmapImage}" />
如果我对此进行注释,则图像似乎已导入,但我无法访问它,例如,通过在列表视图中选择它。在SelectionChanged中,它表示这个对象被另一个线程拥有
如何解决这些问题?提前谢谢 您必须将GUI更新整理到主线程。基本上,您只能通过多线程从磁盘加载图像,但GUI的实际更新必须通过单线程完成 有很多方法可以做到这一点,关于stackoverflow的许多问题都可以解决这个问题。以下是一些让你开始学习的方法 如何为此使用绑定列表
后台工作人员对于大型任务来说是很好的,但是如果是像你正在做的那样简单的事情,我更愿意这样做 从图像列表开始
List<Image> Images =new List<Image>();
不保证我在代码中有正确数量的括号。在类似情况下,我做了以下操作:
- 创建一个实际执行图像加载工作的ImageProvider类
- 让图像的viewmodel绑定到我的ItemViewModel中的ImageSource
- 让这个ImageSource变得懒惰 // //这里是伪代码 Lazy Lazy=new Lazy(imageProvider.LoadImage(this.imagePath)) //在ImageViewModel中 imageSource{get{return lazy.Value;}}
this.Dispatcher
的BeginInvoke
方法,对吗?实际上,我已经有了一个ObservableCollection,我将ListView的项目源绑定到它(更新的原始帖子)。但是如果我做了imageCollectionVM.Images.Add(image)代码>在操作中,我收到“DependencySource和DependencyObject应该在同一线程中”错误消息。如果您试图使用ObservableCollection,请参阅我在回答中发布的最后一个链接,它有一个绑定列表,可以从后台线程更新
List<Image> Images =new List<Image>();
Task.Factory.StartNew( () =>
{
string[] files = e.Argument as string[];
foreach (string file in files)
{
ImageModel image = new ImageModel();
image.FilePath = file;
// _importWorker.ReportProgress(1, image);
this.BeginInvoke( new Action(() =>
{
Images.Add(image);
}));
}
});