代码之家  ›  专栏  ›  技术社区  ›  Ilya Khaprov

如何在后台线程[WPF]中加载文件图标

  •  1
  • Ilya Khaprov  · 技术社区  · 15 年前

    我的代码提取文件图标(甚至拇指)。但是,如果我有很多文件,可能需要一段时间。我尝试使用背景线程加载图标。

    1. 从图标提取的表单文件创建位图,并存储在列表中。对于每个本机位图,其句柄似乎只存在于所有者线程(即创建位图的线程)中。

    所以问题是,我不知道如何在UI线程中使用在后台线程中创建的位图。

    2b。在后台线程中创建wpf位图,并在UI线程中使用它们

    2 回复  |  直到 13 年前
        1
  •  3
  •   Thomas Levesque    15 年前

    您只需要在加载图像后冻结它们。冻结对象是只读的,可以跨线程安全使用。例如:

    private void _backgroundWorkerLoadImage_DoWork(object sender, DoWorkEventArgs e)
    {
        BitmapImage img = new BitmapImage();
        img.BeginInit();
        img.UriSource = imageUri;
        img.EndInit();
        img.Freeze();
        e.Result = img;
    }
    
    void _backgroundWorkerLoadImage_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        var img = e.Result as ImageSource;
        imageControl.Source = img;
    }
    
        2
  •  1
  •   Richard Lucas    15 年前

    如果我理解正确,提高性能的一种方法可能是在读取文件图标的过程中引入一些智能。

    考虑一个目录中有很多DOC文件的情况,读取它们的文件图标没有多大意义。

    您将拥有一个已读取的文件图标缓存,因此无需读取每个.DOC文件的文件图标。在内存中保存图像有一个折衷办法,但您应该能够在性能和使用太多内存之间找到一个令人满意的折衷办法。