c#memoryCache在插入缓存时访问新值

c#memoryCache在插入缓存时访问新值,c#,caching,c#-4.0,memorycache,C#,Caching,C# 4.0,Memorycache,我有以下代码块,它正在接收sessionId,需要返回相关的userId private static async Task<string> AddOrGetExisting(string sessionId, Func<Task<Tuple<string, DateTime>>> factory) { var newValue = new Lazy<Task<Tuple<string, DateTime>>

我有以下代码块,它正在接收sessionId,需要返回相关的userId

private static async Task<string> AddOrGetExisting(string sessionId, Func<Task<Tuple<string, DateTime>>> factory)
{
      var newValue = new Lazy<Task<Tuple<string, DateTime>>>(factory);
      var oldValue = _cache.AddOrGetExisting(sessionId, newValue, new CacheItemPolicy() { AbsoluteExpiration = (await newValue.Value).Item2 } ) as Lazy<Task<Tuple<string, DateTime>>>;
      try
      {
          return (await (oldValue ?? newValue).Value).Item1;
      }
      catch
      {
          _cache.Remove(sessionId);
          throw;
      }
}
private静态异步任务AddOrGetExisting(字符串sessionId,Func工厂)
{
var newValue=新延迟(工厂);
var oldValue=_cache.AddOrGetExisting(sessionId,newValue,newcacheitempolicy(){AbsoluteExpiration=(wait newValue.Value).Item2})作为惰性;
尝试
{
返回(等待(旧值??新值).Value.Item1;
}
抓住
{
_cache.Remove(sessionId);
投掷;
}
}
每当我存储会话时,我都希望缓存只存储到会话过期为止

元组包含(字符串)
UserId
和(日期时间)
ExpirationDate
。 我所写的问题是,我一直在调用工厂,从数据库中获取数据,这有点破坏了缓存的整个概念


如何仅在检索后/如果检索到该值,才能访问该值?

是的,问题在于过期时间取决于计算值。请参阅和。顺便说一句,第一行和try/catch子句是多余的。您应该在这里使用直接强制转换,而不是像那样使用
。可能会抛出一个优异点,例如任务取消或内存访问问题,或者更重要的是,我的工厂可能会抛出一个。你确定这是多余的吗?在第二行中(就在
try
之前),您已经计算了表达式
(wait newValue.Value)。Item2
。就像我说的,
oldValue
永远不会为空,所以try块中的表达式等价于
(wait oldValue.Value)。Item2
。但是,当您第一次将
oldValue
放入缓存时,它是
newValue
,这意味着它是同一个表达式。如果它当时没有抛出,现在就不会抛出……虽然这个问题很老,但这确实是一个问题:)我如何将过期作为值。但我是分三个阶段做的。获取oldvalue,如果没有,则获取新值并插入我的到期日。