public void Start_CancelledTask_NewTaskShouldBeCreated()
        {
            int count = 0;
            Func <IEventNotification, Task> func = @event =>
            {
                count++;
                return(Task.CompletedTask);
            };

            var subscription = Mock.Of <ISubscription>(s =>
                                                       s.Execution == Mock.Of <IExecution>(e =>
                                                                                           e.Delegate == func &&
                                                                                           e.MaxTake == 100 &&
                                                                                           e.Interval == TimeSpan.FromMilliseconds(100)) &&
                                                       s.Options == Mock.Of <IOptions>(o =>
                                                                                       o.QueueCapacity == 1000)
                                                       );

            var handler = new SubscriptionHandler(subscription);
            var sts     = new SubscriptionTokenSource();

            sts.Cancel();

            handler.Start(sts);
            Assert.False(Common.WaitUntil(() => count > 0, TimeSpan.FromSeconds(1)));

            handler.Start();
            Assert.True(Common.WaitUntil(() => count > 0, TimeSpan.FromSeconds(3)));
        }
        private SubscriptionTokenSource StartWithPausedState(SubscriptionHandler handler)
        {
            var sts = new SubscriptionTokenSource();

            sts.Pause();
            handler.Start(sts);
            return(sts);
        }
Beispiel #3
0
        public void Dispose()
        {
            if (!_isDisposed)
            {
                SubscriptionTokenSource?.Dispose();
                _isDisposed = true;

                GC.SuppressFinalize(this);
            }
        }
Beispiel #4
0
        private void InitiateTask(SubscriptionTokenSource subscriptionTokenSource)
        {
            bool state() => _task == null || _task.IsCompleted;

            if (state())
            {
                lock (_taskSync)
                {
                    if (state())
                    {
                        SubscriptionTokenSource?.Dispose();
                        SubscriptionTokenSource = subscriptionTokenSource;

                        _task = Task.Run(async() =>
                        {
                            //Initial delay
                            await Task.Delay(Subscription.Execution.Interval).ConfigureAwait(false);

                            while (!SubscriptionTokenSource.IsCancelled)
                            {
                                try
                                {
                                    await SubscriptionTokenSource.PauseIfRequested().ConfigureAwait(false);
                                    await OnTaskRun().ConfigureAwait(false);
                                }
                                catch (Exception)
                                {
                                    //Catch all exceptions and never allow to throw that causes application to crash.
                                    //TODO : internal logging
                                }
                                finally
                                {
                                    _lastExecuted = DateTime.UtcNow;
                                    await Task.Delay(Subscription.Execution.Interval).ConfigureAwait(false);
                                }
                            }
                        }, SubscriptionTokenSource.CancellationToken);
                    }
                }
            }
        }
Beispiel #5
0
 internal void Start(SubscriptionTokenSource subscriptionTokenSource)
 {
     InitiateTask(subscriptionTokenSource);
 }