gpt4 book ai didi

c# - 在内存中存储数组的最佳实践

转载 作者:行者123 更新时间:2023-11-30 15:38:58 27 4
gpt4 key购买 nike

所以我们有一个 WCF 服务,它向客户端提供一些对象。我们的 wcf 服务从数据访问层 (DAL) 获取数据。 DAL 从 API 获取数据并将其格式化为我们可以使用的对象。对于大多数对象,这种方法效果很好。

但我们还需要来自 API 的对象列表,并且这些对象不会更改。针对 API 的查询需要 15 到 20 秒。对同一数据多次运行此查询的方式很长。 所以我们想将列表存储在内存中。因为 DBA 不是我们最好的 friend ,而且 SQLite 或 SQL CE 不是一个选项。

现在我们有这样的东西,第一次加载组时,我们将它们存储在一个私有(private)静态变量中。 这是执行此类操作的正确方法,还是有更好的方法?


public static class GroupStore
{
private static DTO.Group[] _groups;

public static DTO.Group[] GetAll()
{
if (_groups == null)
{
var dal = PluginHandler.Instance.GetPlugin();
_groups = dal.GetAll();
}
return _groups;
}
}

最佳答案

如果您使用的是 .NET4,则可以使用 Lazy<T>类(class)。它是线程安全的,并为您包装了延迟加载。

代码变得更干净了:

public static class GroupStore
{
private static Lazy<DTO.Group[]> _groups = new Lazy<DTO.Group[]>(GetAll);

public static DTO.Group[] Groups { get { return _groups.Value; } }

private static DTO.Group[] GetAll()
{
var dal = PluginHandler.Instance.GetPlugin();
return dal.GetAll();
}
}

更新

您在评论中链接的答案没问题。但是 IsValueCreated无故使用锁定(因为列表可能在检查和下一次访问之间发生变化)。

如果调用“ToString”,我也不会创建值。

更干净的解决方案:

public sealed class Lazy<T> where T : class
{
private readonly object _syncRoot = new object();
private readonly Func<T> _factory;
private T _value;

public Lazy(Func<T> factory)
{
if (factory == null) throw new ArgumentNullException("factory");

_factory = factory;
}

public T Value
{
get
{
if (_value == null)
{
lock (_syncRoot)
{
if (_value == null)
{
_value = _factory();
}
}
}
return _value;
}
}

public override string ToString()
{
return _value == null ? "Not created" : _value.ToString();
}
}

关于c# - 在内存中存储数组的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10947944/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com