为了同步对ASP.NET缓存中Dictionary对象的访问,建议使用同步对象。ASP.NET缓存值的范围是否与静态变量相同或更窄?
Dino Esposito建议使用静态变量作为锁定目标(请参阅http://www.drdobbs.com/cpp/184406369)。但是,这只有在ASP.NET缓存值具有与静态变量相同的范围(或范围更窄)时才有效。
有没有人知道这种效果的文档?
为了同步对ASP.NET缓存中Dictionary对象的访问,建议使用同步对象。ASP.NET缓存值的范围是否与静态变量相同或更窄?
Dino Esposito建议使用静态变量作为锁定目标(请参阅http://www.drdobbs.com/cpp/184406369)。但是,这只有在ASP.NET缓存值具有与静态变量相同的范围(或范围更窄)时才有效。
有没有人知道这种效果的文档?
//根据评论更新 缓存对于每个应用域都是唯一的,因此您无需担心。请参见MSDN here
有每个应用程序域缓存 类的一个实例。作为 结果,缓存属性返回的缓存对象 是 应用程序域中所有请求的缓存对象 。
//原来的答复
我不知道我很明白你的问题。缓存中的任何内容都可以全局访问(或者至少可以访问缓存对象的任何内容)。
只要它是您访问对象的唯一位置,此代码将是安全的。
private static readonly object lockme = new object();
public void SetDictionaryValue(string key, string value)
{
lock (lockme)
{
var lookup = (Dictionary<string, string>)GetFromCache("LookupDictionary");
lookup["key"] = value;
}
}
public string GetDictionaryValue(string key)
{
lock (lockme)
{
var lookup = (Dictionary<string, string>)GetFromCache("LookupDictionary");
return lookup["key"];
}
}
但是,是的,它不能保证是安全的,因为可能是从缓存别的地方检索字典,并修改它的其他代码。不知道你如何保证那不可能发生。我的意思是你可以使用一个GUID作为键,但是你可以迭代所有的缓存变量。
我不知道我是否在帮你吗?
为什么不锁定字典对象?那么你的锁将更加细致。虽然我同意Andrew对静态对象的锁定很好。
我想我的问题可以改写为“提交值的AppDomain之外可用的ASP.NET缓存对象中的值”。如果是这样,一个静态变量锁定将不会执行。 – goofballLogic 2010-02-23 13:45:04
缓存存在于当前的AppDomain中,我会尝试找到一些官方文档来更新我的答案。 – 2010-02-23 14:03:50