public void Unschedule_EntityUnscheduledAfterFirstCall_CallbackInvokedOnlyOnce()
        {
            var invoked = new AutoResetEvent(false);
            var entity0 = new Entity {
                Id = "entity0"
            };
            var period0 = TimeSpan.FromMilliseconds(1100);
            var entity1 = new Entity {
                Id = "entity1"
            };
            var    period1           = TimeSpan.FromMilliseconds(700);
            var    timeout           = TimeSpan.FromSeconds(2);
            Entity lastInvokedEntity = null;

            using var scheduler = new EntityActionScheduler <Entity>(e =>
            {
                lastInvokedEntity = e;
                invoked.Set();
                return(Task.CompletedTask);
            }, autoStart: true, runOnce: false, new TimerFactory());

            scheduler.ScheduleEntity(entity0, period0);
            scheduler.ScheduleEntity(entity1, period1);

            VerifyEntities(scheduler, entity0, entity1);

            Assert.True(invoked.WaitOne(timeout));
            Assert.Same(entity1, lastInvokedEntity);

            Assert.True(invoked.WaitOne(timeout));
            Assert.Same(entity0, lastInvokedEntity);

            scheduler.UnscheduleEntity(entity1);
            VerifyEntities(scheduler, entity0);

            Assert.True(invoked.WaitOne(timeout));
            Assert.Same(entity0, lastInvokedEntity);

            VerifyEntities(scheduler, entity0);
        }
Example #2
0
        public void Unschedule_EntityUnscheduledAfterFirstCall_CallbackInvokedOnlyOnce()
        {
            var entity0 = new Entity {
                Id = "entity0"
            };
            var entity1 = new Entity {
                Id = "entity1"
            };
            Entity lastInvokedEntity = null;
            var    timerFactory      = new TestTimerFactory();

            using var scheduler = new EntityActionScheduler <Entity>(e =>
            {
                lastInvokedEntity = e;
                return(Task.CompletedTask);
            }, autoStart: true, runOnce: false, timerFactory);

            scheduler.ScheduleEntity(entity0, TimeSpan.FromMilliseconds(Period0));
            scheduler.ScheduleEntity(entity1, TimeSpan.FromMilliseconds(Period1));

            VerifyEntities(scheduler, entity0, entity1);

            timerFactory.FireTimer(1);

            Assert.Same(entity1, lastInvokedEntity);

            timerFactory.FireTimer(0);

            Assert.Same(entity0, lastInvokedEntity);

            scheduler.UnscheduleEntity(entity1);
            VerifyEntities(scheduler, entity0);
            timerFactory.AssertTimerDisposed(1);

            timerFactory.FireTimer(0);

            Assert.Same(entity0, lastInvokedEntity);

            VerifyEntities(scheduler, entity0);
        }