我正在尝试实现基于ObjectCache的FileCache(https://github.com/acarteas/FileCache)。我正在尝试检查缓存对象是否存在,或者在需要时添加它并返回。但是,如果对象不存在,则不执行委托,并引发错误:[...]中的类型'myNamespace.Controllers.ListController + <> c__DisplayClass0_0'未标记为可序列化。我尝试过的内容(简体):private string generateString(int? Id){ return "String";}public ActionResult GetSomething(int? Id){ var cacheFilePath = $"{AppDomain.CurrentDomain.BaseDirectory}{"\\cache"}"; var cache = new FileCache(cacheFilePath, false, TimeSpan.FromSeconds(30)); if (purgeCache) cache.Remove($"CacheKey{Id}"); Func<string> createString = () => generateString(Id); var myString = (string) cache.AddOrGetExisting($"CacheKey{Id}", createString, new CacheItemPolicy() { AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(30) }); return new JsonStringResult(myString);}好的,现在我尝试用Serializable指定委托createString,但这不起作用。有人可以指出我正确的方向吗?本质上我想要:-运行一条语句,返回generateString(123)的先前输出;如果它不存在或已过期,则应重新生成它。
2 回答
隔江千里
TA贡献1906条经验 获得超10个赞
由于的性质FileCache,我认为做到这一点的唯一合理方法是回退到通常的方法-检查项目是否存在于缓存中,如果不存在,则添加它:
private static readonly _cacheLock = new object();
private static readonly FileCache _cache = new FileCache($"{AppDomain.CurrentDomain.BaseDirectory}{"\\cache"}", false, TimeSpan.FromSeconds(30));
/// ...
lock (_cacheLock) {
var myString = _cache.Get($"CacheKey{Id}");
if (myString == null) {
myString = generateString(Id);
_cache.Set($"CacheKey{Id}", myString, new CacheItemPolicy() { AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(30) });
}
}
锁定是必需的,因为FileCache这两个对象都从同一文件进行写入和读取,并且从多个线程执行此操作永远都不安全。
- 2 回答
- 0 关注
- 149 浏览
添加回答
举报
0/150
提交
取消