/// <summary> /// Get current value /// </summary> public async Task <T> GetValue() { switch (mode) { case LazyThreadSafetyMode.PublicationOnly: { var current = valueReference; if (current != null) { return((T)current); } var newValue = await valueGenerator(); lock (lockObj) { valueReference = newValue; return((T)valueReference); } } case LazyThreadSafetyMode.None: { var current = valueReference; if (current != null) { return((T)current); } current = await valueGenerator(); valueReference = current; return((T)valueReference); } default: throw new Exception(mode.ToString()); } }
/// <summary> /// Get current value /// </summary> public async Task <T> GetValue() { switch (mode) { case LazyThreadSafetyMode.PublicationOnly: { var current = valueReference; if (IsNotNullOrExpired(current)) { return(current.Value); } var newValue = await valueGenerator(); lock (lockObj) { valueReference = new ValueAndExpires <T>(newValue); return(valueReference.Value); } } case LazyThreadSafetyMode.None: { var current = valueReference; if (IsNotNullOrExpired(current)) { return(current.Value); } current = new ValueAndExpires <T>(await valueGenerator()); valueReference = current; return(valueReference.Value); } default: throw new Exception(mode.ToString()); } }