为了账号安全,请及时绑定邮箱和手机立即绑定

Func <string> DoSomething:类型[…] Controller

Func <string> DoSomething:类型[…] Controller

C#
慕容森 2021-05-18 09:17:14
我正在尝试实现基于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这两个对象都从同一文件进行写入和读取,并且从多个线程执行此操作永远都不安全。


查看完整回答
反对 回复 2021-05-21
  • 2 回答
  • 0 关注
  • 149 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信