C#内存缓存资源边界

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

我想知道System.Runtime.Cache.MemoryCache是将对象封送到单独的资源空间中,还是与调用对象位于同一资源空间中

例如,假设我在某个抽象对象上编写了一个helper方法,该方法允许我将对象(如DataTables)读写到缓存:

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);
    }