我正在使用ObjectListView在C#中编写视频管理器,其中生成,保存预览图像,并将条目放入sqlite数据库。从那里,我使用VirtualObjectListView组件在详细信息模式下显示条目(包括第一个图像作为预览)。
我遇到的问题是,有几百个+条目,它开始吃掉内存,我看到很多的文件(很多重复)在Process Explorer中打开/锁定。所以,我试图实现一个缓存系统 - 一次只加载30个图像,而加载新图像时卸载不需要的图像。
它不起作用。它最终以某种方式加载每个文件的多个副本,它只是感觉...... Hacky。过去几天我一直在寻找一个可以绑定方法的事件或事情,但是我做不到,所以我必须在 GetNthObject > AbstractVirtualListDataSource
无论如何,这是我的代码:
public override object GetNthObject(int n) {
VideoInfo p = (VideoInfo)this.Objects[n % this.Objects.Count];
p.ID = n;
int storeBufferHalf = 5;
int storeFrom = (n - storeBufferHalf < 0) ? 0 : n - storeBufferHalf;
int storeTo = (n + storeBufferHalf >= Objects.Count()) ? Objects.Count() - 1 : n + storeBufferHalf;
foreach (int cacheItem in cacheList.ToList()) {
if (cacheItem >= storeFrom && cacheItem <= storeTo)
continue;
VideoInfo unloadItem = (VideoInfo)this.Objects[cacheItem];
//Debug.WriteLine(cacheItem + " Preparing to delete cache: " + unloadItem.Name);
unloadItem.DestroyPreviewImage();
cacheList.Remove(cacheItem);
}
//Load up items into cache.
for (int i = storeFrom; i < storeTo; i++) {
if (!cacheList.Contains(i)) {
VideoInfo loadItem = (VideoInfo)this.Objects[i];
if (loadItem.PreviewImage != null)
continue;
loadItem.SetPreviewImage();
cacheList.Add(i);
}
}
return p;
}
更多信息:基本上,种有效...... 加载每个文件的多个副本,最终加载的图像数量超过了向下滚动一下(实际上是60个项目的整个测试数据库),但是上下滚动列表几次就可以卸载文件(至少根据Process Explorer)。
之后,它开始重新加载它们中的一些,其中一些...... ...
答案 0 :(得分:0)
我认为您需要对输入源列表进行分组/拆分。
考虑使用this answer作为将IEnumerable拆分为n个部分的方法。然后使用按钮获取下一个/最后一个部分,并将其设置为绑定源。