【问题标题】:shared asp.net object as static or cache共享 asp.net 对象作为静态或缓存
【发布时间】:2011-10-01 06:43:43
【问题描述】:

在 asp.net 中存储共享对象的最佳方法是什么?对于每个请求,每个请求都会多次调用它。我一直在使用这两种方法,但我想知道是否有更好的方法。我每小时刷新一次这个对象。

public static List<ResourceObject> SharedResources = new List<ResourceObject>()

//OR

public static List<ResourceObject> SharedResources
{
    get
    {
        List<ResourceObject> _sharedResources = HttpContext.Current.Cache["RedirectRoutes"] as List<ResourceObject>;
        if (_sharedResources == null)
        {
            _sharedResources = LoadNewSharedResource();
            HttpContext.Current.Cache["RedirectRoutes"] = _sharedResources;
        }

        return _redirectRoutes;
    }
    set
    {
        HttpContext.Current.Cache["RedirectRoutes"] = value;
    }
}

【问题讨论】:

  • 两者看起来都足够合理,具体取决于您的具体需求。但请注意,如果有任何改变返回的List&lt;T&gt;(添加/删除元素等),那么您可能会看到问题。您最好返回 ReadOnlyCollection&lt;T&gt; 之类的内容以防止任何突变。
  • 我实际上通常忽略了“集合”。所以,我认为这可以防止这个问题。
  • 不,一个集合实际上是可以的,因为引用分配保证是原子的(在公共字段的情况下)并且 ASP.NET Cache 类保证是线程安全的(在财产)。我说的是SharedResources.Add(/* something */)SharedResources.RemoveAt(0) 等。在多线程环境中,它们可能会在运行时失败。

标签: c# .net asp.net caching static


【解决方案1】:

如果您的对象经常更改(即您提到的每小时一次),那么您最好使用缓存,因为它能够为您处理刷新(假设您在添加值时传递了正确的参数缓存)。如果您使用静态值,它不会每小时自动清除,因此您需要自己实施检查。

【讨论】:

    【解决方案2】:

    如果这看起来是一个需要跨请求持续存在的对象,那么这是实现它的一种非常好的和合理的方法。如果在一次调用中多次访问缓存版本,您可能希望将缓存版本放在局部变量中,以节省每次从缓存中检索它的时间。

    缓存是否存在您担心的特定问题?

    【讨论】:

    • 我最关心的是只使用静态对象而不是将其存储在缓存中。我想我只是需要得到保证,我所做的事情并没有被人反对。
    • 它不会被我讨厌。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-18
    • 2014-01-04
    相关资源
    最近更新 更多