C#内存缓存资源边界
我想知道System.Runtime.Cache.MemoryCache是将对象封送到单独的资源空间中,还是与调用对象位于同一资源空间中 例如,假设我在某个抽象对象上编写了一个helper方法,该方法允许我将对象(如DataTables)读写到缓存:C#内存缓存资源边界,c#,caching,com+,memorycache,C#,Caching,Com+,Memorycache,我想知道System.Runtime.Cache.MemoryCache是将对象封送到单独的资源空间中,还是与调用对象位于同一资源空间中 例如,假设我在某个抽象对象上编写了一个helper方法,该方法允许我将对象(如DataTables)读写到缓存: public static void WriteCache(string KeyName, object Item, int ExpireMinutes = 30) { ObjectCache cache = MemoryCache.Def
public static void WriteCache(string KeyName, object Item, int ExpireMinutes = 30)
{
ObjectCache cache = MemoryCache.Default;
CacheItemPolicy policy = new CacheItemPolicy();
policy.SlidingExpiration = new TimeSpan(0, ExpireMinutes, 0);
policy.Priority = CacheItemPriority.Default;
cache.Add(new CacheItem(KeyName, Item), policy);
}
WriteCache("MY_DATA", dt, 15);
然后将数据表发送到缓存:
public static void WriteCache(string KeyName, object Item, int ExpireMinutes = 30)
{
ObjectCache cache = MemoryCache.Default;
CacheItemPolicy policy = new CacheItemPolicy();
policy.SlidingExpiration = new TimeSpan(0, ExpireMinutes, 0);
policy.Priority = CacheItemPriority.Default;
cache.Add(new CacheItem(KeyName, Item), policy);
}
WriteCache("MY_DATA", dt, 15);
在调用代码中处理DataTable之后,还会在缓存中处理DataTable吗?或者DataTables是否复制到缓存中(如服务器模式下的COM+对象,当它封送到其资源空间时)?请注意,DataTable没有任何非托管资源可处置() 引用类型(如DataTable)作为对所添加对象的引用添加到MemoryCache中。对象保留在相同的资源空间中 下面是一个简单的POCO来说明这种行为:
class SimpleClass
{
public string someText { get; set; }
}
static void Main()
{
var cache = MemoryCache.Default;
var simpleObject = new SimpleClass { someText = "starting text" };
SimpleClass cachedContent = null;
CacheItemPolicy policy = new CacheItemPolicy();
cache.Add("mykey", simpleObject, policy);
// Expect "starting text" output
cachedContent = (SimpleClass) cache.Get("mykey");
Console.WriteLine(cachedContent.someText);
simpleObject.someText = "new text";
// Now it will output "new text"
cachedContent = (SimpleClass)cache.Get("mykey");
Console.WriteLine(cachedContent.someText);
// simpleObject points nowhere now but object still exists,
// pointed to by cache item so will still output "new text"
simpleObject = null;
cachedContent = (SimpleClass)cache.Get("mykey");
Console.WriteLine(cachedContent.someText);
}
请注意,DataTable没有任何要处置的非托管资源() 引用类型(如DataTable)作为对所添加对象的引用添加到MemoryCache中。对象保留在相同的资源空间中 下面是一个简单的POCO来说明这种行为:
class SimpleClass
{
public string someText { get; set; }
}
static void Main()
{
var cache = MemoryCache.Default;
var simpleObject = new SimpleClass { someText = "starting text" };
SimpleClass cachedContent = null;
CacheItemPolicy policy = new CacheItemPolicy();
cache.Add("mykey", simpleObject, policy);
// Expect "starting text" output
cachedContent = (SimpleClass) cache.Get("mykey");
Console.WriteLine(cachedContent.someText);
simpleObject.someText = "new text";
// Now it will output "new text"
cachedContent = (SimpleClass)cache.Get("mykey");
Console.WriteLine(cachedContent.someText);
// simpleObject points nowhere now but object still exists,
// pointed to by cache item so will still output "new text"
simpleObject = null;
cachedContent = (SimpleClass)cache.Get("mykey");
Console.WriteLine(cachedContent.someText);
}