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