public void Should_not_stop_when_action_throws_OperationCanceledException_with_unknown_token()
        {
            var counter = 0;

            Task Action()
            {
                counter++;
                throw new OperationCanceledException(new CancellationToken(true));
            }

            var periodicalAction = new AsyncPeriodicalAction(
                Action,
                errorHandler,
                () => TimeSpan.Zero);

            periodicalAction.Start();

            var spinWait = new SpinWait();

            while (counter < 2)
            {
                spinWait.SpinOnce();
            }

            periodicalAction.Stop();
            errors.Should().BeGreaterThan(1);
        }
        public void Should_stop_when_wait_first_delay()
        {
            var canStop = false;
            var calls   = 0;

            TimeSpan Provider()
            {
                canStop = true;
                return(TimeSpan.FromSeconds(100500));
            }

            var periodicalAction = new AsyncPeriodicalAction(
                () =>
            {
                ++calls;
                throw new Exception();
            },
                errorHandler,
                Provider,
                true);

            periodicalAction.Start();

            var spinWait = new SpinWait();

            while (!canStop)
            {
                spinWait.SpinOnce();
            }

            periodicalAction.Stop();
            calls.Should().Be(0);
            errors.Should().Be(0);
        }
        public void Should_not_stop_when_action_throws_exception()
        {
            var counter = 0;

            Task Action()
            {
                counter++;
                return(Task.FromException(new Exception()));
            }

            var periodicalAction = new AsyncPeriodicalAction(
                Action,
                errorHandler,
                () => TimeSpan.Zero);

            periodicalAction.Start();

            var spinWait = new SpinWait();

            while (counter < 2)
            {
                spinWait.SpinOnce();
            }

            periodicalAction.Stop();
            errors.Should().BeGreaterThan(1);
        }
        private void StartDaemons(ISettingsProvider settingsProvider)
        {
            _dump = new AsyncPeriodicalAction(
                async() =>
            {
                if (!Directory.Exists(Path.GetDirectoryName(settingsProvider.StorageSettings.WeaponIndexPath)))
                {
                    Directory.CreateDirectory(settingsProvider.StorageSettings.WeaponIndexPath);
                }

                await File.WriteAllTextAsync(settingsProvider.StorageSettings.WeaponIndexPath,
                                             _itemByName.ToJson());
            }, exception => _log.Error(exception, "Can't dump index"),
                () => settingsProvider.StorageSettings.IndexDumpPeriod);
            _cleanup = new PeriodicalAction(() =>
            {
                foreach (var pair in _itemByName.ToArray())
                {
                    if (pair.Value.ExpireAt <= DateTime.UtcNow)
                    {
                        _itemByName.TryRemove(pair.Key, out _);
                    }
                }
            }, exception => _log.Error(exception, "can't cleanup"),
                                            () => _settingsProvider.StorageSettings.WeaponStorageCleanupPeriod
                                            );
            _dump.Start();
            _cleanup.Start();
        }
Exemple #5
0
        public void Initialize()
        {
            _currentState = ReadFromSnapshotAndOpLog();

            _periodicalSnapshot = new AsyncPeriodicalAction(async() => await MakeStateSnapshot(),
                                                            exception => _log.Error(exception, "Can't snapshot"), () => 5.Seconds());
            _periodicalSnapshot.Start();
        }
        public VictimIndex(ISettingsProvider settingsProvider, ILog log)
        {
            Initialize(settingsProvider);

            _dump = new AsyncPeriodicalAction(
                async() =>
            {
                await File.WriteAllTextAsync(settingsProvider.ApplicationSettings.QueuePath, _victims.ToJson());
            }, exception => log.Error(exception, "Can't dump index"),
                () => settingsProvider.ApplicationSettings.DumpPeriod);
            _dump.Start();
        }
        public ReusableFileSystemWatcher(string path, string filter, FileSystemEventHandler eventHandler)
        {
            folder = new DirectoryInfo(path);
            lastSeenCreationTime = folder.CreationTime;
            this.filter          = filter;
            this.eventHandler    = eventHandler;

            currentWatcher = TryCreateWatcher();

            periodicalChecker = new AsyncPeriodicalAction(RecreateWatcherIfNeeded, exception => {}, () => CheckPeriod, true);
            periodicalChecker.Start();
        }
        public void Should_stop_when_action_throws_OperationCanceledException_with_proper_token()
        {
            var canStop = false;

            Task Action(CancellationToken token, TimeSpan remaining)
            {
                canStop = true;

                var actionSpinWait = new SpinWait();

                while (!token.IsCancellationRequested)
                {
                    actionSpinWait.SpinOnce();
                }

                token.ThrowIfCancellationRequested();
                return(Task.CompletedTask);
            }

            var periodicalAction = new AsyncPeriodicalAction(
                Action,
                errorHandler,
                () => TimeSpan.Zero);

            periodicalAction.Start();

            var spinWait = new SpinWait();

            while (!canStop)
            {
                spinWait.SpinOnce();
            }

            periodicalAction.Stop();
            errors.Should().Be(0);
        }