过期懒惰<T> class
Expiring Lazy<T> class
.NET 库中是否有任何 class 可以作为到期 Lazy<T>
?
想法是 Func<T>
值工厂 lambda 被传递到那里并且仅在第一次或超时时被调用。
我已经创建了简单的 class 来做到这一点,但我想避免发明轮子。
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;
}
}
不,框架中没有等效项class。
请注意,您的 class 没有高级锁定等 Lazy<T>
有。看看 this answer 看看如何有效地做到这一点。
.NET 库中是否有任何 class 可以作为到期 Lazy<T>
?
想法是 Func<T>
值工厂 lambda 被传递到那里并且仅在第一次或超时时被调用。
我已经创建了简单的 class 来做到这一点,但我想避免发明轮子。
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;
}
}
不,框架中没有等效项class。
请注意,您的 class 没有高级锁定等 Lazy<T>
有。看看 this answer 看看如何有效地做到这一点。