62 lines
1.3 KiB
C#
62 lines
1.3 KiB
C#
using JD.Kernel.Classes;
|
|
using JD.Kernel.StaticHelpers;
|
|
|
|
namespace JD.TeaBoxAddinSystem.Addins
|
|
{
|
|
/// <summary>
|
|
/// Create a delay between the assignation of a value and its creation. Perfect for lazy loading.
|
|
/// </summary>
|
|
/// <typeparam name="T">Type of its internal value.</typeparam>
|
|
public class ThreadSafeReference<T> : Reference<T>
|
|
{
|
|
#region Variables
|
|
|
|
private readonly object m_lock = new object();
|
|
private readonly Provider<T> m_provider;
|
|
|
|
#endregion
|
|
|
|
#region Constructor/Destructor
|
|
|
|
private ThreadSafeReference(Provider<T> provider)
|
|
{
|
|
m_provider = provider;
|
|
}
|
|
|
|
public new static ThreadSafeReference<T> FromDelegate(Provider<T> provider)
|
|
{
|
|
return new ThreadSafeReference<T>(provider);
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Properties
|
|
|
|
public override T Value
|
|
{
|
|
get
|
|
{
|
|
if (!IsInitialized)
|
|
{
|
|
lock (m_lock)
|
|
{
|
|
return base.Value;
|
|
}
|
|
}
|
|
|
|
return base.Value;
|
|
}
|
|
}
|
|
|
|
#endregion
|
|
|
|
#region Methods
|
|
|
|
protected override T LoadValue()
|
|
{
|
|
return m_provider();
|
|
}
|
|
|
|
#endregion
|
|
}
|
|
}
|