Пример #1
0
        private async Task <bool> OpenReopenAsync(bool reopen)
        {
            using (var openCts = new CancellationTokenSource())
            {
                var openCancellation = openCts.Token;
                var openTask         = Task.Run(
                    async() => await _handler.OnConnecting(openCancellation).ConfigureAwait(false),
                    CancellationToken.None
                    );

                try
                {
                    if (reopen && _connection.State == LinkConnectionState.Active)
                    {
                        _logger.Debug($"Reopening in {_recoveryInterval.TotalSeconds:0.###}s");
                        await Task.Delay(_recoveryInterval, _disposeCancellation)
                        .ConfigureAwait(false);
                    }

                    _logger.Debug("Opening");
                    _model = await _connection
                             .CreateModelAsync(_disposeCancellation)
                             .ConfigureAwait(false);

                    _modelActiveCts = new CancellationTokenSource();

                    _model.ModelShutdown     += ModelOnModelShutdown;
                    _model.CallbackException += ModelOnCallbackException;
                    _model.BasicAcks         += ModelOnBasicAcks;
                    _model.BasicNacks        += ModelOnBasicNacks;
                    _model.BasicReturn       += ModelOnBasicReturn;

                    _logger.Debug($"Model created, channel number: {_model.ChannelNumber}");
                }
                catch (Exception ex)
                {
                    _logger.Error($"Cannot create model: {ex.Message}");
                    return(false);
                }
                finally
                {
                    openCts.Cancel();

                    try
                    {
                        await openTask
                        .ConfigureAwait(false);
                    }
                    catch (Exception ex)
                    {
                        _logger.Warning($"Connecting handler throws exception: {ex}");
                    }
                }
            }

            _logger.Debug($"Opened(channelNumber: {_model.ChannelNumber})");
            return(true);
        }