Exemple #1
0
        public void Can_restrain_apps_to_wait_until_beginning_start_of_all_apps()
        {
            // Arrange
            var starts        = new ConcurrentBag <int>();
            var starts_Add    = new MarshalByRefAction <int>(i => starts.Add(i));
            var processes     = new ConcurrentBag <int>();
            var processes_Add = new MarshalByRefAction <int>(i => processes.Add(i));

            void Synchronize(Action <ISynchronizer> action)
            {
                var curMeth = MethodBase.GetCurrentMethod();
                var setter1 = Synchronizable.SystemWideEventSet(Key.Get(curMeth, "Foo"), obj => (int)obj == 1);
                var setter2 = Synchronizable.SystemWideEventSet(Key.Get(curMeth, "Bar"), obj => (int)obj == 2);

                using (var sync = setter1.And(setter2).GetSynchronizer())
                    action(sync);
            }

            // Act
            Synchronize(sync =>
            {
                var mre1  = new ST::ManualResetEvent(false);
                var task1 = Task.Run(() =>
                                     AppDomain.CurrentDomain.RunAtIsolatedDomain((starts_Add_, processes_Add_, mre1_) =>
                                                                                 Synchronize(sync_ =>
                {
                    starts_Add_.Invoke(1);
                    sync_.Begin(1).Wait();
                    mre1_.WaitOne(10000);
                    processes_Add_.Invoke(1);
                    sync_.End(1).Wait();
                }), starts_Add, processes_Add, mre1));

                var mre2  = new ST::ManualResetEvent(false);
                var task2 = Task.Run(() =>
                                     AppDomain.CurrentDomain.RunAtIsolatedDomain((starts_Add_, processes_Add_, mre2_) =>
                                                                                 Synchronize(sync_ =>
                {
                    starts_Add_.Invoke(2);
                    sync_.Begin(2).Wait();
                    mre2_.WaitOne(10000);
                    processes_Add_.Invoke(2);
                    sync_.End(2).Wait();
                }), starts_Add, processes_Add, mre2));

                sync.NotifyAll(false).Wait();


                // Assert
                CollectionAssert.AreEquivalent(new[] { 1, 2 }, starts);
                CollectionAssert.IsEmpty(processes);
                mre1.Set();
                mre2.Set();
                Task.WaitAll(task1, task2);
            });
        }
Exemple #2
0
        public void Can_delay_apps_by_the_passed_time_span()
        {
            // Arrange
            var task1BeginTime        = default(DateTimeOffset);
            var task1BeginTime_Assign = new MarshalByRefAction <DateTimeOffset>(dt => task1BeginTime = dt);
            var task2BegunTime        = default(DateTimeOffset);
            var task2BegunTime_Assign = new MarshalByRefAction <DateTimeOffset>(dt => task2BegunTime = dt);

            void Synchronize(Action <ISynchronizer> action)
            {
                var curMeth = MethodBase.GetCurrentMethod();
                var setter1 = Synchronizable.SystemWideEventSet(Key.Get(curMeth, "Foo"), obj => (int)obj == 1);
                var setter2 = Synchronizable.SystemWideEventSet(Key.Get(curMeth, "Bar"), obj => (int)obj == 2);

                using (var sync = setter1.And(setter2.Delay(TimeSpan.FromMilliseconds(1000))).GetSynchronizer())
                    action(sync);
            }

            // Act
            Synchronize(sync =>
            {
                var mre1  = new ST::ManualResetEvent(false);
                var task1 = Task.Run(() =>
                                     AppDomain.CurrentDomain.RunAtIsolatedDomain((task1BeginTime_Assign_, mre1_) =>
                                                                                 Synchronize(sync_ =>
                {
                    task1BeginTime_Assign_.Invoke(DateTimeOffset.Now);
                    sync_.Begin(1).Wait();
                    mre1_.Set();
                    sync_.End(1).Wait();
                }), task1BeginTime_Assign, mre1));

                var mre2  = new ST::ManualResetEvent(false);
                var task2 = Task.Run(() =>
                                     AppDomain.CurrentDomain.RunAtIsolatedDomain((task2BegunTime_Assign_, mre2_) =>
                                                                                 Synchronize(sync_ =>
                {
                    sync_.Begin(2).Wait();
                    task2BegunTime_Assign_.Invoke(DateTimeOffset.Now);
                    mre2_.Set();
                    sync_.End(2).Wait();
                }), task2BegunTime_Assign, mre2));

                sync.NotifyAll(false).Wait();


                // Assert
                ST::WaitHandle.WaitAll(new[] { mre1, mre2 });
                Assert.GreaterOrEqual(task2BegunTime - task1BeginTime, TimeSpan.FromMilliseconds(1000));
                Task.WaitAll(task1, task2);
            });
        }
Exemple #3
0
        public void Should_ignore_empty_when_restraining_apps()
        {
            // Arrange
            var starts        = new ConcurrentBag <int>();
            var starts_Add    = new MarshalByRefAction <int>(i => starts.Add(i));
            var processes     = new ConcurrentBag <int>();
            var processes_Add = new MarshalByRefAction <int>(i => processes.Add(i));

            void Synchronize(Action <ISynchronizer> action)
            {
                var curMeth = MethodBase.GetCurrentMethod();
                var empty   = Synchronizable.Empty();
                var setter1 = Synchronizable.SystemWideEventSet(Key.Get(curMeth, "Foo"), obj => (int)obj == 1);
                var setter2 = Synchronizable.SystemWideEventSet(Key.Get(curMeth, "Bar"), obj => (int)obj == 2);
                var waiter3 = Synchronizable.SystemWideEventWait(Key.Get(curMeth, "Baz"), obj => (int)obj == 3);
                var waiter4 = Synchronizable.SystemWideEventWait(Key.Get(curMeth, "Qux"), obj => (int)obj == 4);

                using (var sync = setter1.Or(setter2).Or(empty).And(empty.Then(waiter3).Then(empty).Then(waiter4).Then(empty)).And(empty).GetSynchronizer())
                    action(sync);
            }

            // Act
            Synchronize(sync =>
            {
                var mre1  = new ST::ManualResetEvent(false);
                var task1 = Task.Run(() =>
                                     AppDomain.CurrentDomain.RunAtIsolatedDomain((starts_Add_, processes_Add_, mre1_) =>
                                                                                 Synchronize(sync_ =>
                {
                    mre1_.WaitOne(10000);
                    starts_Add_.Invoke(1);
                    sync_.Begin(1).Wait();
                    processes_Add_.Invoke(1);
                    sync_.End(1).Wait();
                }), starts_Add, processes_Add, mre1));

                var task2 = Task.Run(() =>
                                     AppDomain.CurrentDomain.RunAtIsolatedDomain((starts_Add_, processes_Add_) =>
                                                                                 Synchronize(sync_ =>
                {
                    starts_Add_.Invoke(2);
                    sync_.Begin(2).Wait();
                    processes_Add_.Invoke(2);
                    sync_.End(2).Wait();
                }), starts_Add, processes_Add));

                var task3 = Task.Run(() =>
                                     AppDomain.CurrentDomain.RunAtIsolatedDomain((starts_Add_, processes_Add_) =>
                                                                                 Synchronize(sync_ =>
                {
                    starts_Add_.Invoke(3);
                    sync_.Begin(3).Wait();
                    processes_Add_.Invoke(3);
                    sync_.End(3).Wait();
                }), starts_Add, processes_Add));

                var task4 = Task.Run(() =>
                                     AppDomain.CurrentDomain.RunAtIsolatedDomain((starts_Add_, processes_Add_) =>
                                                                                 Synchronize(sync_ =>
                {
                    starts_Add_.Invoke(4);
                    sync_.Begin(4).Wait();
                    processes_Add_.Invoke(4);
                    sync_.End(4).Wait();
                }), starts_Add, processes_Add));

                sync.NotifyAll(false).Wait();


                // Assert
                CollectionAssert.DoesNotContain(starts, 1);
                CollectionAssert.AreEqual(new[] { 3, 4 }, processes.Intersect(new[] { 3, 4 }));
                mre1.Set();
                Task.WaitAll(task1, task2, task3, task4);
            });
        }