private async Task ProcessIncomingFramesAsync(CancellationToken cancellationToken) { try { while (!cancellationToken.IsCancellationRequested) { Frame frame = await _connection.ReadFrameAsync(cancellationToken); if (frame is PingFrame pingFrame) { if (pingFrame.AckFlag) { _output?.WriteLine($"Received unexpected PING ACK ({pingFrame.Data})"); await _framesChannel.Writer.WriteAsync(frame, cancellationToken); } else { _output?.WriteLine($"Received PING ({pingFrame.Data})"); Interlocked.Increment(ref _pingCounter); if (_sendPingResponse > 0) { await GuardConnectionWriteAsync(() => _connection.SendPingAckAsync(pingFrame.Data, cancellationToken), cancellationToken); } } } else if (frame is WindowUpdateFrame windowUpdateFrame) { _output?.WriteLine($"Received WINDOW_UPDATE"); } else if (frame is not null) { //_output?.WriteLine($"Received {frame}"); await _framesChannel.Writer.WriteAsync(frame, cancellationToken); } } } catch (OperationCanceledException) { } _output?.WriteLine("ProcessIncomingFramesAsync finished"); await _connection.DisposeAsync(); }