我正在使用LazyCache ,并且希望每小时刷新一次缓存,但理想情况下,我希望缓存项过期后的第一个调用者不要等待缓存重新加载。我写了以下内容
\n\npublic async Task<List<KeyValuePair<string, string>>> GetCarriersAsync()\n{\n\n var options = new MemoryCacheEntryOptions\n {\n AbsoluteExpirationRelativeToNow = new TimeSpan(1,0,0),// consider to config\n }.RegisterPostEvictionCallback(\n async (key, value, reason, state) =>\n {\n await GetCarriersAsync();//will save to cache\n _logger.LogInformation("Carriers are reloaded: " );\n });\n Func<Task<List<KeyValuePair<string, string>>>> cacheableAsyncFunc = () => GetCarriersFromApi();\n var cachedCarriers = await _cache.GetOrAddAsync($"Carriers", cacheableAsyncFunc, options);\n\n return cachedCarriers;\n}\nRun Code Online (Sandbox Code Playgroud)\n\n但是,当缓存项过期时,不会调用 RegisterPostEvictionCallback,而是仅在对该项的下一个请求发生时调用(并且调用者需要等待漫长的操作)。
\n\n线程 Expiration 几乎永远不会在后台自行发生\xc2\xa0#248解释说这是设计使然,并建议解决方法来指定 CancellationTokenSource.CancelAfter(TimeSpan.FromHours(1)) 而不是 SetAbsoluteExpiration。
\n\n不幸的是,LazyCache.GetOrAddAsync 没有\xe2\x80\x99t 有 CancellationToken 作为参数。\n在预定时间触发缓存重新加载且第一个用户的等待时间最短的最佳方法是什么?
\n