示例#1
0
        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();
        }
示例#2
0
        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));
        }
示例#3
0
        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();
        }