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

我正在尝试实现基于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)的先前输出;如果它不存在或已过期,则应重新生成它。


慕容森
浏览 150回答 2
2回答

隔江千里

由于的性质FileCache,我认为做到这一点的唯一合理方法是回退到通常的方法-检查项目是否存在于缓存中,如果不存在,则添加它:private static readonly _cacheLock = new object();private static readonly FileCache _cache = new FileCache($"{AppDomain.CurrentDomain.BaseDirectory}{"\\cache"}", false, TimeSpan.FromSeconds(30));/// ...lock (_cacheLock) {&nbsp; &nbsp; var myString = _cache.Get($"CacheKey{Id}");&nbsp; &nbsp; if (myString == null) {&nbsp; &nbsp; &nbsp; &nbsp; myString = generateString(Id);&nbsp; &nbsp; &nbsp; &nbsp; _cache.Set($"CacheKey{Id}", myString, new CacheItemPolicy() { AbsoluteExpiration = DateTimeOffset.Now.AddSeconds(30) });&nbsp; &nbsp; }}锁定是必需的,因为FileCache这两个对象都从同一文件进行写入和读取,并且从多个线程执行此操作永远都不安全。
打开App,查看更多内容
随时随地看视频慕课网APP