private async Task PipeProcessorAsync(PipeReader reader, CancellationToken cancelationToken = default) { while (!cancelationToken.IsCancellationRequested) { var result = await reader.ReadAsync(cancelationToken).ConfigureAwait(false); var buffer = result.Buffer; SequencePosition?position; do { position = buffer.PositionOf((byte)'\n'); if (position != null) { var notif = msgProc.PushMessage(buffer.Slice(0, position.Value).ToArray()); if (notif.HasValue) { dispatcher.Invoke(notif.Value); } // +2 = skipping \n\r buffer = buffer.Slice(buffer.GetPosition(2, position.Value)); } } while (position != null); reader.AdvanceTo(buffer.Start, buffer.End); if (result.IsCompleted || result.IsCanceled) { break; } } reader.Complete(); }
private void NetworkLoop(object ctx) { while (true) { string line; try { line = tcpReader.ReadLine(); } catch (IOException) { line = null; } if (line == null) { break; } if (string.IsNullOrWhiteSpace(line)) { continue; } var message = line.Trim(); msgProc.PushMessage(message); } OnDisconnected?.Invoke(this, new DisconnectEventArgs(Reason.LeftServer)); }
private async Task WriteLoopAsync(NetworkStream stream, PipeReader reader) { var dataWriteBuffer = new byte[4096]; while (true) { var result = await reader.ReadAsync(); ReadOnlySequence <byte> buffer = result.Buffer; SequencePosition? position = null; do { position = buffer.PositionOf((byte)'\n'); if (position != null) { var notif = msgProc.PushMessage(buffer.Slice(0, position.Value).ToArray()); if (notif.HasValue) { dispatcher.Invoke(notif.Value); } // +2 = skipping \n\r buffer = buffer.Slice(buffer.GetPosition(2, position.Value)); } } while (position != null); reader.AdvanceTo(buffer.Start, buffer.End); if (result.IsCompleted) { break; } } reader.Complete(); }