2009-10-21 94 views
1

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

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

  2. 在UI线程创建的本地WPF位图。

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

- 或 -

2b中。在后台创建线程WPF位图,并在UI线程

使用他们。但问题是完全一样的。

回答

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

工作正常!谢谢 – 2009-10-22 16:26:26

1

如果我理解你正确地做什么,以提高性能可能会推出一些智能技术应用到它读取文件图标的过程的一种方式。

考虑一下在目录中有很多.DOC文件的情况,并且没有太多意义可以读取它们中的所有文件图标。

您将拥有一个已被读取的文件图标缓存,因此不需要读取每个.DOC文件的文件图标。有一个权衡这里拿在内存中的图像,但你应该能够得到性能和使用太多内存之间的折中。

+0

你看,问题在于我不仅在谈论图标,而且还在谈论通过shell扩展为我生成的缩略图。所以不同的doc文件会导致不同的大拇指。 .exe文件也是一样 - 几乎每个程序都有独特的图标。无论如何感谢您的重播 – 2009-10-22 16:25:13