如何加快图像添加到ImageList?

时间:2014-11-12 22:43:43

标签: c# winforms listview imagelist

所以我试图将大量图标填充到列表视图中。为了避免漫长的等待时间,我试图让它加载前1000个结果,然后加载更多,如果用户按下更多加载按钮。

在这里,我被困住了。如果我一次加载所有10,000多个图标,则需要37秒。但是,如果我决定每次用户点击按钮时再添加500个图标,则需要40秒,这比一次添加所有图标更糟糕!代码的唯一区别是我必须将这一行作为委托来避免交叉线程问题。有更快的方法吗?

for (int i = lastLoadedIndex; i < lastLoadedIndex+500; i++)
{
    string file = resultArr[i];

    Invoke((MethodInvoker)delegate()
    {
        this.imageList1.Images.Add(Image.FromFile(file));
    });
}

2 个答案:

答案 0 :(得分:2)

要加快批量操作,请考虑使用批量方法(如果可用)。
例如,ImageCollection类型具有AddRange方法 尝试使用它:

int newCount = 500;

// Get a desired part of the `resultArr` array as a new array:
string[] tmp = new string[newCount];
Array.Copy(resultArr, lastLoadedIndex, tmp, 0, newCount);

// Load images:
Image[] images = Array.ConvertAll(tmp, file => Image.FromFile(file));

// Bulk add images to the ImageList:
Invoke((MethodInvoker)(() => imageList1.Images.AddRange(images)));

如果没有帮助,请检查哪些操作很慢:读取图像或附加到ImageList

答案 1 :(得分:0)

编辑#2:该功能的昂贵部分是从文件加载图像。在锁定互斥锁之前放置它应该允许一些并行性值得使用互斥锁的开销。不,此方法不保留顺序。 编辑:将图像直接添加到图像列表而不是临时集合。

public void LoadImagesFromFiles(string[] files)
{
    Mutex imageListLock = new Mutex();
    files.AsParallel().ForAll(file =>
    {
        var img = Image.FromFile(file);
        imageListLock.WaitOne();
        this.imageList1.Images.Add(img);
        imageListLock.ReleaseMutex();
    });
}