private async Task DoBeamJob(BrowserWrapper wrapper, BeamCommand command, CancellationToken deactivateToken)
        {
            using var _ = _logger.BeginScope("{JobType} {CommandId} on {BrowserId}", command.GetType().Name, command.Id, wrapper._id);
            _logger.LogDebug("Start job");

            if (wrapper._isInWork || deactivateToken.IsCancellationRequested)
            {
                return;
            }

            wrapper._isInWork = true;
            if (wrapper.CanBeStopped)
            {
                wrapper._isInWork = false;
                return;
            }

            try
            {
                await(command as IBrowserCommand).Execute(wrapper._driver, deactivateToken, _serviceProvider);
            }
            catch (Exception ex)
            {
                ++wrapper.Fails;
                _logger.LogError(ex, "Job fail", command.GetType().Name, wrapper._id);
            }
            wrapper._isInWork    = false;
            wrapper.LastBeamTime = _dateTimeProvider.UtcNow;

            if (wrapper.Fails >= _poolSettings.Value.BrowserMaxFail)
            {
                wrapper.CanBeStopped = true;
            }
        }
 Task IBrowserPoolAdvanced.RegisterBrowser(BrowserWrapper browser)
 {
     _browsers.Push(browser);
     return(Task.CompletedTask);
 }
 Task IBrowserPoolAdvanced.DoJob(BrowserWrapper wrapper, BeamCommand command)
 => DoBeamJob(wrapper, command, _loopCancelTokenSource.Token);
        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;
            }
        }