【问题标题】:How to load file icons in a background thread [WPF]如何在后台线程中加载文件图标 [WPF]
【发布时间】:2009-10-21 08:00:44
【问题描述】:

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

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

  2. 在 UI 线程中,从本机创建 WPF 位图。

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

-- 或--

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

但问题完全一样。

【问题讨论】:

    标签: c# .net wpf multithreading icons


    【解决方案1】:

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

    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】:

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

      考虑在一个目录中有很多 .DOC 文件并且读取所有文件的图标没有多大意义的情况。

      您将拥有已读取的文件图标缓存,因此无需读取每个 .DOC 文件的文件图标。将图像保存在内存中需要权衡取舍,但您应该能够在性能和使用过多内存之间取得平衡。

      【讨论】:

      • 你看,问题是我说的不仅是图标,还有shell扩展为我生成的缩略图。所以不同的doc文件会产生不同的拇指。 .exe 文件也是如此——几乎每个程序都有唯一的图标。无论如何,谢谢你的重播
      猜你喜欢
      • 1970-01-01
      • 2023-03-25
      • 1970-01-01
      • 2017-03-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多