/// Connect streams and activate async communication private async Task ConnectAsync(CancellationToken token) { Memory <char> buffer = new Memory <char>(new char[1024]); StringBuilder data = new StringBuilder(); StringBuilder newLine = new StringBuilder().AppendLine(); int charsRead; Connected = true; // Primary data communication loop while (Client.Connected) { if (token.IsCancellationRequested) { Disconnect(); break; } charsRead = await Source.ReadAsync(buffer, token); data.Append(buffer.ToArray(), 0, charsRead); if (!Client.Connected || (charsRead <= 0)) { Disconnect(); break; } FixLineEndings(data); if (IsClearCmd(data.ToString())) { await Dest.WriteAsync(newLine, token); } else { await Dest.WriteAsync(data, token); } await Dest.FlushAsync(); data.Clear(); } Dispose(); }