c# - 即将到期的 Lazy<T> 类

标签 c# .net base-class-library

.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;
    }
}

最佳答案

不,框架中没有等效的类。

请注意您的类没有高级锁定等。Lazy<T>拥有。看看this answer了解如何有效地做到这一点。

关于c# - 即将到期的 Lazy<T> 类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34791884/

相关文章:

c# - 取消SemaphoreSlim.WaitAsync保持信号量锁

C#、WPF - VisualBrush 和 OpacityMask

c# - 想要在警报框中显示变量的值

c# - 将 Object.GetHashCode() 转换为 Guid

.net - 自定义路由 ASP.NET MVC 在每个 Controller 中设置默认操作

.net - 使用 2 个 int 参数订阅 Delegate

c# - SortedList<K, V> 存在于哪个 PCL 配置文件中(如果有)?

c# - ASP.NET MVC 单元测试自定义 AuthorizeAttribute

c# - Aspose.Words 第一次保存到 PDF 很慢

c# - NPOI 支持 CSV/TSV?