【发布时间】: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<T>(添加/删除元素等),那么您可能会看到问题。您最好返回ReadOnlyCollection<T>之类的内容以防止任何突变。 -
我实际上通常忽略了“集合”。所以,我认为这可以防止这个问题。
-
不,一个集合实际上是可以的,因为引用分配保证是原子的(在公共字段的情况下)并且 ASP.NET
Cache类保证是线程安全的(在财产)。我说的是SharedResources.Add(/* something */)、SharedResources.RemoveAt(0)等。在多线程环境中,它们可能会在运行时失败。
标签: c# .net asp.net caching static