如何在c#中延迟加载

本文关键字:延迟加载 | 更新日期: 2023-09-27 18:03:53

我正在开发一个游戏模拟器。我有一个名为"Map"的对象,它包含地图的id和其他关于它的各种信息。游戏包含大量地图对象(约10,000个)。数据位于SQL表中,所以我使用它来加载它。

我有一个名为CachedMaps的类,它继承了int和map的KeyedCollection。标识符是映射的id。不幸的是,加载所有的地图大约需要5秒。

无论如何,不是所有的地图都会被访问。我的朋友建议我使用"延迟加载",我不确定如何做到这一点-比如,只有当用户输入时才加载地图的数据或对象。这怎么可能?谢谢你。
public class CachedMaps : KeyedCollection<int, Map>
{
    public CachedMaps()
        : base()
    {
        // The loading code.
        // this.Add(new Map(....));
    }
}

如何在c#中延迟加载

您应该使用Lazy泛型类,其目的正是如此。

使用来自MSDN的示例:("大对象"将是您的地图):

lazyLargeObject = new Lazy<LargeObject>(() => 
{
    LargeObject large = new LargeObject(Thread.CurrentThread.ManagedThreadId);
    // Perform additional initialization here. 
    return large;
});

在我看来,如果你可以调用数据库来加载地图,那么最好的方法就是物理惰性加载(或者这就是我所说的)。

这里的概念是,在第一次加载时,您只获得用户选择地图所需的信息…你怎么做取决于你自己……带有地图名称和id的下拉菜单…带有相关ID的小截图列表(我认为这里是游戏)

然后,只有当用户选择了一个地图,它才会从DB获取完整的地图信息。同样,由于您提到对象很大,我将只缓存"选择地图"部分的地图标识符列表,而不是地图本身……对于这个简单的场景:如果我正在测试你的东西,并运行最终的场景,这是加载所有地图。如果所有这些都被缓存,您将耗尽内存。

我就是这么做的

创建一个包含Dictionary的类,而不是覆盖KeyedCollection的类:

public class CachedMaps
{
    private readonly Dictionary<int, Map> _maps = new Dictionary<int, Map>();
    public Map GetMap(int mapId)
    {
        if (!this._maps.ContainsKey(mapId))
        {
            this._maps[mapId] = this.Add(new Map(....));
        }
        return this._maps[mapId];
    }
}

现在地图是按需加载然后缓存的