过期的Lazy<T>类

5

有没有.NET库中的类可以像 Lazy<T> 一样过期?

这个想法是传入一个 Func<T> 值工厂lambda表达式,只在第一次调用或超时后调用。

我已经创建了一个简单的类来实现它,但我希望避免重新发明轮子。

public class ExpiringLazy<T>
{
    private readonly object valueGetLock = new object();
    private readonly Func<T> valueFactory;
    private readonly TimeSpan timeout;

    private T cachedValue;
    private DateTime cachedTime;

    public T Value
    {
        get
        {
            Thread.MemoryBarrier();

            if (cachedTime.Equals(default(DateTime)) || DateTime.UtcNow > cachedTime + timeout)
            {
                lock (valueGetLock)
                {
                    if (cachedTime.Equals(default(DateTime)) || DateTime.UtcNow > cachedTime + timeout)
                    {
                        cachedValue = valueFactory();
                        Thread.MemoryBarrier();
                        cachedTime = DateTime.UtcNow;
                    }
                }
            }

            return cachedValue;
        }
    } 

    public ExpiringLazy(Func<T> valueFactory, TimeSpan timeout)
    {
        if (valueFactory == null) throw new ArgumentNullException(nameof(valueFactory));
        this.valueFactory = valueFactory;
        this.timeout = timeout;
    }
}

1
在这种情况下,始终使用UtcNow而不是Now - jamespconnor
1个回答

3

不,框架中没有相应的类。

请注意,您的类没有像 Lazy<T> 一样的高级锁定等功能。请查看此答案以了解如何有效地实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接