C# 在C中异步加载图像#

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

我正在开发一个C#WPF应用程序,它加载了大量图像并将其显示为缩略图。我想用多线程的方式来做。因此,我尝试实现一个BackgroundWorker

BackgroundWorker的DoWork()代码:

在我的XAML代码中,我绑定到ImageModel的BitmapImage属性。(AsyncState=True没有帮助。)这里我得到了一个错误:“DependencySource”和“DependencyObject”必须在同一个线程中

<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;}}


ImageProvider类是否使用多线程,或者如何确保GUI不冻结?在我的情况下,ImageProvider没有在UI线程中运行。也许这里有一些工作要做example@Sentropie:我认为,在这里要采取两个步骤来解耦。我想我必须使用
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);
         }));
     }
 });