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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
 public override void Clear()
 {
     original.Clear();
     ReactiveManager.WasChanged(this);
 }
Esempio n. 4
0
 public override bool Contains(T item)
 {
     ReactiveManager.WasRead(this);
     return(original.Contains(item));
 }
Esempio n. 5
0
 /// <summary>
 /// Evaluate the function and return its value.
 /// </summary>
 public T Evaluate()
 {
     return(ReactiveManager.Evaluate(this, func));
 }
Esempio n. 6
0
 public override IEnumerator <T> GetEnumerator()
 {
     ReactiveManager.WasRead(this);
     return(original.GetEnumerator()); //TODO lazyness bug?
 }
Esempio n. 7
0
 /// <summary>
 /// Invalidate the cache manually. Usefull for cases not covered by the Reactive framework.
 /// </summary>
 public void Invalidate()
 {
     IsSet = false;
     ReactiveManager.WasChanged(this);
 }
Esempio n. 8
0
 private static void CollectionChangedHandler(EventPattern <NotifyCollectionChangedEventArgs> eventPattern)
 {
     ReactiveManager.WasChanged(eventPattern.Sender);
 }
Esempio n. 9
0
 public override void Add(TKey key, TValue value)
 {
     original.Add(key, value);
     ReactiveManager.WasChanged(CountAndKeySetReactiveObject);
 }
Esempio n. 10
0
 public override bool ContainsKey(TKey key)
 {
     ReactiveManager.WasRead(CountAndKeySetReactiveObject);
     return(original.ContainsKey(key));
 }
Esempio n. 11
0
 /// <inheritdoc />
 public sealed override void OnSetValue(LocationInterceptionArgs args)
 {
     args.ProceedSetValue();
     ReactiveManager.WasChanged(new CompositeReactiveObject(args.Instance, property));
 }
Esempio n. 12
0
 /// <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);
 }