C# 作为静态或缓存的共享asp.net对象

C# 作为静态或缓存的共享asp.net对象,c#,.net,asp.net,caching,static,C#,.net,Asp.net,Caching,Static,在asp.net中存储共享对象的最佳方法是什么?每个请求都会多次调用它。我一直在使用这两种方法,但我想知道是否有更好的方法。我每小时刷新一次这个对象 public static List<ResourceObject> SharedResources = new List<ResourceObject>() //OR public static List<ResourceObject> SharedResources { get {

在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;
    }
}
公共静态列表SharedResources=新列表() //或 公共静态列表SharedResources { 得到 { 列表_sharedResources=HttpContext.Current.Cache[“RedirectRoutes”]作为列表; 如果(_sharedResources==null) { _sharedResources=LoadNewsSharedResource(); HttpContext.Current.Cache[“重定向路由”]=\u sharedResources; } 返回路线; } 设置 { HttpContext.Current.Cache[“重定向路由”]=值; } }
如果这看起来是一个需要跨请求持久化的对象,那么这是实现它的一个非常好和合理的方法。如果在一次调用中多次访问缓存版本,则可能需要将其放入局部变量中,以保存每次从缓存中检索该版本


像您所关心的那样缓存它是否有一个特定的问题?

如果这看起来是一个需要跨请求持久化的对象,那么这是实现它的一个非常好和合理的方法。如果在一次调用中多次访问缓存版本,则可能需要将其放入局部变量中,以保存每次从缓存中检索该版本


像这样缓存它是否存在您所关心的特定问题?

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

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

根据您的具体需要,两者看起来都很合理。但请注意,如果有任何变化,则返回的
列表将发生变化。
(添加/删除元素等)然后您可能会看到问题。您最好返回类似于
ReadOnlyCollection
的内容以防止任何突变。实际上,我通常省略了“set”。因此,我认为这可以防止此问题。不,set实际上是可以的,因为引用分配是有保证的(对于公共字段)和ASP.NET
Cache
类保证是线程安全的(对于属性)。我所说的是类似于
SharedResources.Add(/*something*/)
SharedResources.RemoveAt(0)
等。在多线程环境中运行时,它们可能会失败。根据您的具体需要,两者看起来都很合理。但请注意,如果有任何变化,则返回的
列表将发生变化(添加/删除元素等)然后,您可能会看到问题。最好返回类似于
ReadOnlyCollection
的内容以防止任何突变。实际上,我通常省略了“set”。因此,我认为这可以防止出现此问题。不,set实际上是可以的,因为引用分配是原子的(在公共字段的情况下)ASP.NET
缓存
类保证线程安全(在属性的情况下)。我所说的是类似于
SharedResources.Add(/*something*/)
SharedResources.RemoveAt(0)
等。在多线程环境中,这些操作在运行时可能会失败。我最关心的是只使用静态对象,而不是将其存储在缓存中。我想我只需要确保我所做的事情不会受到反对。我不会反对。我最关心的是只使用静态对象,而不是存储它在缓存里。我想我只是需要得到保证,我所做的事情没有让我皱眉。它不会让我皱眉。