private static async Task <T> GetOrAddAsync <T>( ObjectCache cache, string key, CacheItemPolicy policy, Func <Task <T> > valueFactory) { var newEntry = new LazyTask <T>(valueFactory); if (cache.AddOrGetExisting(key, newEntry, policy) is LazyTask <T> existingEntry) { return(await existingEntry.Value); } try { Task <T> result = newEntry.Value; if (result.IsCanceled || result.IsFaulted) { cache.Remove(key); } return(await result); } catch { cache.Remove(key); throw; } }
public async Task <bool> Validate() { return(await Conditions.AllFalseAsync( LazyTask <bool> .Create(() => Task.FromResult(false)).Get(), LazyTask <bool> .Create(async() => await ValidateSomenthing()).Get(), LazyTask <bool> .Create(async() => await ValidateAnoterThing()).Get() )); }
IEnumerator Work() { var t1 = Observable.Interval(TimeSpan.FromSeconds(1)).Take(4).ToLazyTask(); var t2 = Observable.Interval(TimeSpan.FromSeconds(1)).Select(x => x * x).Take(4).ToLazyTask(); var t3 = Observable.Throw <Unit>(new Exception()).ToLazyTask(); yield return(LazyTask.WhenAll(t1, t2, t3)); logger.Debug(t1.Result + ":" + t2.Result); logger.Debug(t3.Exception); }