private async Task TryExecuteIterationsAsync() { var iterationProcessor = _configuration.IterationProcessorProvider(); while (CanExecuteIteration(_iterationOrdinal)) { try { await ExecuteIterationAsync(iterationProcessor); var canExecuteNextIteration = CanExecuteIteration(_iterationOrdinal + 1); if (!canExecuteNextIteration) { break; } _iterationOrdinal++; } catch (Exception exception) { try { _configuration.Hooks.OnError.Execute(exception); await _configuration.Hooks.OnErrorAsync.ExecuteAsync(exception); } catch (Exception onErrorException) { //Think what to do about it } } } }
/// <summary> /// Start the Warden. /// It will be running iterations in a loop (infinite by default but can bo changed) and executing all of the configured hooks. /// </summary> /// <returns></returns> public async Task StartAsync() { _running = true; _configuration.Hooks.OnStart.Execute(); await _configuration.Hooks.OnStartAsync.ExecuteAsync(); var iterationProcessor = _configuration.IterationProcessorProvider(); while (CanExecuteIteration(_iterationOrdinal)) { try { _configuration.Hooks.OnIterationStart.Execute(_iterationOrdinal); await _configuration.Hooks.OnIterationStartAsync.ExecuteAsync(_iterationOrdinal); var iteration = await iterationProcessor.ExecuteAsync(Name, _iterationOrdinal); _configuration.Hooks.OnIterationCompleted.Execute(iteration); await _configuration.Hooks.OnIterationCompletedAsync.ExecuteAsync(iteration); var canExecuteNextIteration = CanExecuteIteration(_iterationOrdinal + 1); if (!canExecuteNextIteration) { break; } _iterationOrdinal++; } catch (Exception exception) { try { _configuration.Hooks.OnError.Execute(exception); await _configuration.Hooks.OnErrorAsync.ExecuteAsync(exception); } catch (Exception onErrorException) { //Think what to do about it } } finally { await Task.Delay(_configuration.IterationDelay); } } }
private async Task TryExecuteIterationsAsync() { var iterationProcessor = _configuration.IterationProcessorProvider(); _currentIterationCancellationTokenSource = new CancellationTokenSource(); while (CanExecuteIteration(_iterationOrdinal)) { try { _currentIterationTask = Task.Run(() => ExecuteIterationAsync(iterationProcessor), _currentIterationCancellationTokenSource.Token); await _currentIterationTask; var canExecuteNextIteration = CanExecuteIteration(_iterationOrdinal + 1); if (!canExecuteNextIteration) { break; } _iterationOrdinal++; } catch (Exception exception) { try { _logger.Error("There was an error while executing Warden iteration " + $"{_iterationOrdinal}.", exception); _logger.Trace("Executing Warden hooks OnError."); _configuration.Hooks.OnError.Execute(exception); _logger.Trace("Executing Warden hooks OnErrorAsync."); await _configuration.Hooks.OnErrorAsync.ExecuteAsync(exception); } catch (Exception onErrorException) { _logger.Error("There was an error while executing internal Warden error hooks " + $"for iteration {_iterationOrdinal}.", onErrorException); } } } }