我希望在Lazy对象上实现一个过期时间。过期冷却时间必须从第一次检索该值开始计算。如果我们获取了该值,但已经过期,则重新执行该函数并重置过期时间。
我不熟悉扩展、partial关键字,并且不知道最佳实现方式。
谢谢!
编辑:
到目前为止的代码:
新编辑:
新代码:
我不熟悉扩展、partial关键字,并且不知道最佳实现方式。
谢谢!
编辑:
到目前为止的代码:
新编辑:
新代码:
public class LazyWithExpiration<T>
{
private volatile bool expired;
private TimeSpan expirationTime;
private Func<T> func;
private Lazy<T> lazyObject;
public LazyWithExpiration( Func<T> func, TimeSpan expirationTime )
{
this.expirationTime = expirationTime;
this.func = func;
Reset();
}
public void Reset()
{
lazyObject = new Lazy<T>( func );
expired = false;
}
public T Value
{
get
{
if ( expired )
Reset();
if ( !lazyObject.IsValueCreated )
{
Task.Factory.StartNew( () =>
{
Thread.Sleep( expirationTime );
expired = true;
} );
}
return lazyObject.Value;
}
}
}
Lazy<T>
类中,这是行不通的(你必须修改它的基本行为)。最好创建自己的包装器,然后在需要延迟初始化时在其中使用。如果你正在使用我在答案中使用的那个(或类似的方法),你根本不需要Lazy<T>
,因为它已经模仿了它的行为。 - Mario