Пример #1
0
        /// <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());
            }
        }
Пример #2
0
 private bool IsNotNullOrExpired(ValueAndExpires <T> current)
 {
     return(current != null && current.Expires > now());
 }