如何在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(....));
}
}
您应该使用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];
}
}
现在地图是按需加载然后缓存的