如何加快向ImageList添加图像的速度
本文关键字:图像 速度 添加 ImageList 何加快 | 更新日期: 2023-09-27 18:30:14
所以我试图在列表视图中填充大量图标。为了避免漫长的等待时间,我试图让它加载前1000个结果,然后如果用户按下"加载更多"按钮,则加载更多。
这就是我被卡住的地方。如果我一次加载所有10000多个图标,需要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));
});
}
若要加快任何批量操作,请考虑使用bulk方法(如果可用)
例如,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
。
EDIT#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();
});
}