/// <summary> /// Execute a command /// </summary> /// <param name="command">unique ID of command</param> public void Execute(BrowserCommand command) { // verify that the command exists Debug.Assert(m_commands.Contains(command), "Attempted to Execute a command that doesn't exist"); // execute IBrowserCommand cmdExecute = (IBrowserCommand)m_commands[command]; if (cmdExecute != null) { cmdExecute.Execute(); } }
private async Task DoJob(BrowserWrapper wrapper, IBrowserCommand command, CancellationToken deactivateToken) { using var _ = _logger.BeginScope("{JobType} {CommandId} on {BrowserId}", command.GetType().Name, command.Id, wrapper._id); _logger.LogDebug("Start job"); if (!await SaveIfNotValidCommand(command)) { _browsers.Push(wrapper); return; } if (wrapper._isInWork) { _logger.LogError(new InvalidOperationException("Browser wrapper is in inconsistent state. Field name _isInWork."), "Illegal state occurred"); _actions.Enqueue(command); return; } wrapper._isInWork = true; if (wrapper.CanBeStopped) { _logger.LogDebug("Current browser will be stopped. Reenqueue action."); _actions.Enqueue(command); wrapper._isInWork = false; return; } _logger.LogDebug("Validation completed"); var localLoopCancel = new CancellationTokenSource(); var localLoopCancelToken = localLoopCancel.Token; var t = Task.Run(async() => { while (true) { if (localLoopCancelToken.IsCancellationRequested) { break; } else if (command.CancellationToken.IsCancellationRequested) { break; } else if (deactivateToken.IsCancellationRequested) { await _stateProvider.SaveAction(command); break; } Thread.Sleep(200); } }); try { await command.Execute(wrapper._driver, deactivateToken, _serviceProvider); } catch (Exception ex) { ++wrapper.Fails; _logger.LogError(ex, "Job fail", command.GetType().Name, wrapper._id); if (!deactivateToken.IsCancellationRequested) { _actions.Enqueue(command); } } localLoopCancel.Cancel(); wrapper._isInWork = false; wrapper.LastJobTime = _dateTimeProvider.UtcNow; _logger.LogDebug("Finish job", command.GetType().Name, wrapper._id); if (wrapper.Fails < _poolSettings.Value.BrowserMaxFail) { _browsers.Push(wrapper); } else { wrapper.CanBeStopped = true; } }