'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 |
|---|
