只使用ObjectListView基于VirtualObjectListView中可见的内容加载和卸载数据?

时间:2013-04-05 00:26:52

标签: c# winforms caching objectlistview

我正在使用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)。

之后,它开始重新加载它们中的一些,其中一些...... ...

1 个答案:

答案 0 :(得分:0)

我认为您需要对输入源列表进行分组/拆分。

考虑使用this answer作为将IEnumerable拆分为n个部分的方法。然后使用按钮获取下一个/最后一个部分,并将其设置为绑定源。