'Creating a ReadOnlySequence with multiple segments

How do I create a ReadOnlySequence with multiple segments? In the code below, I used the Sequence class from MessagePack, but it doesn't really matter which one I use as soon as I achieve what I need.

I need to simulate multiple segments in order to test SendLoopAsync method. SendAsync's Sequence outputs a single segment for some reason, even tho I write two times to the sequence.

public ValueTask SendAsync(string message)
{
    // TODO: Simulate multiple segments
    var bytes = Encoding.UTF8.GetBytes(message);

    var first = bytes.Take(128).ToArray();
    var second = bytes.Skip(128).ToArray();

    var payload = new Sequence<byte>(); // should be disposed later on
    payload.Write(first);
    payload.Write(second);

    return _output.Writer.WriteAsync(new Message
    {
        MessageType = WebSocketMessageType.Text,
        Payload = payload
    }, CancellationToken.None);
}

private async Task SendLoopAsync(CancellationToken cancellationToken)
{
    while (await _output.Reader.WaitToReadAsync(cancellationToken).ConfigureAwait(false))
    {
        while (_output.Reader.TryRead(out var message))
        {
            var sequence = message.Sequence.AsReadOnlySequence;

            if (sequence.IsEmpty)
            {
                continue;
            }

            while (!sequence.IsSingleSegment)
            {
                await _clientWebSocket.SendAsync(sequence.First, message.MessageType, false, cancellationToken).ConfigureAwait(false);
                sequence = sequence.Slice(sequence.First.Length);
            }

            await _clientWebSocket.SendAsync(sequence.First, message.MessageType, true, cancellationToken).ConfigureAwait(false);
            message.Sequence.Dispose();
        }
    }
}


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source