0

我希望有人可以帮助我弄清楚为什么 C# 的 MemoryCache 没有按预期的方式工作。

我有一个包含公共静态类的 dll 库。这个静态类具有从默认内存缓存中添加/获取字符串的功能。这是一个dll。这是代码:

using System;
using System.Runtime.Caching;

namespace ClassHelper
{
    public static class CacheHelper
    {
        private static MemoryCache cache = MemoryCache.Default;
        private static CacheEntryRemovedCallback callback = null;
        private static CacheItemPolicy policy = null;

        public static void Add(string key, string value)
        {
            callback = new CacheEntryRemovedCallback(MyCachedItemRemovedCallback);
            policy = new CacheItemPolicy();
            policy.AbsoluteExpiration = DateTime.UtcNow.AddDays(5);
            policy.RemovedCallback = callback;

            cache.Set(key, value, policy);
        }

        public static bool Exists(string key)
        {
            if (cache.Contains(key))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public static object Get(string key)
        {
            return cache.Get(key);
        }

        public static void Remove(string key)
        {
            cache.Remove(key);
        }

        private static void MyCachedItemRemovedCallback(CacheEntryRemovedArguments arguments) 
        { 
            // Log these values from arguments list 
            String strLog = String.Concat("Reason: ", arguments.RemovedReason.ToString(), " | Key-Name: ", arguments.CacheItem.Key, " | Value-Object: ", arguments.CacheItem.Value.ToString()); 
        }
    }
}

然后我有另一个类(非静态)调用使用 CacheHelper 类向/从缓存中添加/获取项目。这是另一个dll。此 dll 在运行时按顺序使用两次(序列 1 和 2)。如果有帮助,这是一个 BizTalk 管道组件。当第一次执行这个类时,我可以看到对象被添加到序列 1 的“默认”内存缓存中;但是,当此类在序列 2 中时,“默认”内存缓存变为空。奇怪的是,如果我再次运行该类,我可以看到先前的消息仍在序列 1 的缓存中,但序列 2 再次出现一个空缓存。看起来该静态类被两个不同的实例实例化了两次“默认”内存缓存。这是因为 BizTalk 会为每个管道分别加载组件吗?如果是这种情况,如何使用 MemoryCache.Default 实现公共缓存?

4

0 回答 0