public async Task <CycleProcessingContext> ProcessAsync([NotNull] CycleProcessingContext context) { if (context == null) { throw new ArgumentNullException(nameof(context)); } if (!context.IsValid()) { _logger.Warning($"{GetType().Name}: действие не будет выполнено, т.к. в обработке сеанса возникли ошибки"); return(context); } var pumpingResult = context.TryGetAutoPumpingResultParams(); if (!(pumpingResult?.WasPumpingCompleted ?? false)) { _logger?.Trace($"{GetType().Name}: получение данных не будет выполнено, " + $"т.к. накачка манжеты завершилась неудачно"); var forcedRequest = context.TryGetForcedDataCollectionRequest(); forcedRequest?.PressureParamsSemaphore.SetResult(true); return(context); } var isFree = await _mutex .WaitAsync(_blockWaitingTimeout) .ConfigureAwait(false); if (!isFree) { _logger?.Warning($"{GetType().Name}: предыдущий запрос еще выполняется. " + $"Новый запрос не будет выполнен, т.к. прошло больше " + $"{_blockWaitingTimeout.TotalMilliseconds} мс"); var forcedRequest = context.TryGetForcedDataCollectionRequest(); forcedRequest?.PressureParamsSemaphore.SetResult(true); return(context); } Devices.Monitor.Infrastructure.PatientPressureParams param = null; var sessionInfo = context.TryGetSessionProcessingInfo(); var cycleNumber = sessionInfo?.CurrentCycleNumber; var iterationInfo = context.TryGetIterationParams(); var iterationNumber = iterationInfo?.CurrentIteration; try { _logger?.Trace($"{GetType().Name}: запрос показателей давления с таймаутом " + $"{_updatePatientParamTimeout.TotalMilliseconds} мс"); var timeoutPolicy = Policy.TimeoutAsync(_updatePatientParamTimeout); param = await timeoutPolicy.ExecuteAsync( _monitorController .GetPatientPressureParamsAsync) .ConfigureAwait(false); } catch (DeviceConnectionException e) { context.AddOrUpdate( new ExceptionCycleProcessingContextParams( new SessionProcessingException( SessionProcessingErrorCodes.MonitorConnectionError, e.Message, e, cycleNumber, iterationNumber))); } catch (TimeoutRejectedException e) { context.AddOrUpdate( new ExceptionCycleProcessingContextParams( new SessionProcessingException( SessionProcessingErrorCodes.PatientPressureParamsRequestTimeout, "Получение показателей давления пациента прервано по таймауту", e, cycleNumber, iterationNumber))); } catch (Exception e) { context.AddOrUpdate( new ExceptionCycleProcessingContextParams( new SessionProcessingException( SessionProcessingErrorCodes.PatientPressureParamsRequestError, e.Message, e, cycleNumber, iterationNumber))); } finally { var forcedRequest = context.TryGetForcedDataCollectionRequest(); forcedRequest?.PressureParamsSemaphore.SetResult(true); _mutex.Release(); if (param == null) { param = GetDefaultParams(); } } _logger?.Trace($"{GetType().Name}: текущие показатели давления: систолическиое - {param.SystolicArterialPressure}, " + $"диастолическое - {param.DiastolicArterialPressure}, " + $"среднее - {param.AverageArterialPressure}"); UpdateContex(param, context); return(context); }