public Task WriteDataAsync(int streamId, Span <byte> data, bool endStream, CancellationToken cancellationToken) { var tasks = new List <Task>(); lock (_writeLock) { _outgoingFrame.PrepareData(streamId); while (data.Length > _outgoingFrame.Length) { data.Slice(0, _outgoingFrame.Length).CopyTo(_outgoingFrame.Payload); data = data.Slice(_outgoingFrame.Length); tasks.Add(WriteAsync(_outgoingFrame.Raw, cancellationToken)); } _outgoingFrame.Length = data.Length; if (endStream) { _outgoingFrame.DataFlags = Http2DataFrameFlags.END_STREAM; } data.CopyTo(_outgoingFrame.Payload); tasks.Add(WriteAsync(_outgoingFrame.Raw, cancellationToken)); return(Task.WhenAll(tasks)); } }