我希望有人可以帮助我弄清楚为什么 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 实现公共缓存?