public void ReactiveManagerForwardThreadSafety() { var dependency = new object(); var firsts = Enumerable.Range(0, 10000).Select(_ => new Dependent()).ToList(); var first = new Thread(() => { foreach (var obj in firsts) { ReactiveManager.Evaluate(obj, () => { ReactiveManager.WasRead(dependency); return(true); }); } }); var seconds = Enumerable.Range(0, 10000).Select(_ => new Dependent()).ToList(); var second = new Thread(() => { foreach (var obj in seconds) { ReactiveManager.Evaluate(obj, () => { ReactiveManager.WasRead(dependency); return(true); }); } }); first.Start(); second.Start(); first.Join(); second.Join(); var dependencyCount = ReactiveManager.GetDependents(dependency).Count(); Assert.AreEqual(20000, dependencyCount); }
public void TestSourceEquality() { var source1 = new EqualityBasedOnId(1); var source2 = new EqualityBasedOnId(2); var source3 = new EqualityBasedOnId(1); var function = new ReactiveExpression <bool>(() => { ReactiveManager.WasRead(source1); return(true); }); var counter = 0; var expectation = 1; function.Subscribe(getValue => Const(getValue, () => counter++)); ReactiveManager.WasChanged(source1); Assert.AreEqual(++expectation, counter); ReactiveManager.WasChanged(source2); Assert.AreEqual(expectation, counter); ReactiveManager.WasChanged(source3); Assert.AreEqual(expectation, counter); }
public override void Clear() { original.Clear(); ReactiveManager.WasChanged(this); }
public override bool Contains(T item) { ReactiveManager.WasRead(this); return(original.Contains(item)); }
/// <summary> /// Evaluate the function and return its value. /// </summary> public T Evaluate() { return(ReactiveManager.Evaluate(this, func)); }
public override IEnumerator <T> GetEnumerator() { ReactiveManager.WasRead(this); return(original.GetEnumerator()); //TODO lazyness bug? }
/// <summary> /// Invalidate the cache manually. Usefull for cases not covered by the Reactive framework. /// </summary> public void Invalidate() { IsSet = false; ReactiveManager.WasChanged(this); }
private static void CollectionChangedHandler(EventPattern <NotifyCollectionChangedEventArgs> eventPattern) { ReactiveManager.WasChanged(eventPattern.Sender); }
public override void Add(TKey key, TValue value) { original.Add(key, value); ReactiveManager.WasChanged(CountAndKeySetReactiveObject); }
public override bool ContainsKey(TKey key) { ReactiveManager.WasRead(CountAndKeySetReactiveObject); return(original.ContainsKey(key)); }
/// <inheritdoc /> public sealed override void OnSetValue(LocationInterceptionArgs args) { args.ProceedSetValue(); ReactiveManager.WasChanged(new CompositeReactiveObject(args.Instance, property)); }
/// <summary> /// Evaluate the expression and return its value. /// </summary> public T Evaluate() { return(ReactiveManager.Evaluate(this, expression)); }
static void OnResultOnCollectionChanged(object sender, NotifyCollectionChangedEventArgs args) { ReactiveManager.WasChanged(sender); }