public async Task StartAsync(RabbitMQProtocolReader reader, IConnectionHandler connection, IChannelHandler channel, CancellationToken token = default) { _connectionHandler = connection; _channelHandler = channel; var headerReader = new FrameHeaderReader(); _isClosed = false; //while (true) while (!_isClosed) { var result = await reader.ReadAsync(headerReader, token).ConfigureAwait(false); switch (result.FrameType) { case RabbitMQConstants.FrameMethod: { var method = await reader.ReadAsync(_methodHeaderReader, token).ConfigureAwait(false); await ProcessMethod(reader, ref result, ref method, token).ConfigureAwait(false); break; } case RabbitMQConstants.FrameHeartbeat: { await reader.ReadNoPayloadAsync(token).ConfigureAwait(false); await _connectionHandler.OnHeartbeatAsync().ConfigureAwait(false); break; } default: { throw new RabbitMQFrameException(result.FrameType); } } } }
private async Task StartReading() { var headerReader = new FrameHeaderReader(); try { while (true) { var result = await _protocol.Reader.ReadAsync(headerReader, _cts.Token).ConfigureAwait(false); _protocol.Reader.Advance(); if (result.IsCompleted) { break; } var header = result.Message; // Debug.WriteLine($"{header.FrameType} {header.Channel} {header.PaylodaSize}"); switch (header.FrameType) { case 1: { if (header.Channel == 0) { await Channel0.HandleAsync(header).ConfigureAwait(false); break; } await ProcessChannels(header).ConfigureAwait(false); break; } case 2: { await ProcessChannels(header).ConfigureAwait(false); break; } case 8: { await _protocol.Reader.ReadAsync(new NoPayloadReader()).ConfigureAwait(false); _protocol.Reader.Advance(); await _protocol.Writer.WriteAsync(new HeartbeatWriter(), false).ConfigureAwait(false); break; } default: throw new Exception($"Frame type missmatch:{header.FrameType}, {header.Channel}, {header.PaylodaSize}"); } } } catch (Exception e) { Console.WriteLine(e.Message); Console.WriteLine(e.StackTrace); _context.Abort(); _cts.Cancel(); _endReading.SetResult(false); } }