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

时间:2009-10-21 08:00:45

标签: c# .net wpf multithreading icons

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

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

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

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

    - 或 -

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

    但问题完全一样。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

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

考虑一下目录中有很多.DOC文件的情况,并且读取所有文件的文件图标没什么意义。

您将拥有已经读取的文件图标缓存,因此无需读取每个.DOC文件的文件图标。这里有一个折扣用于将图像保存在内存中,但是你应该能够在性能和使用太多内存之间获得一个愉快的媒介。