internal async Task SendCommandAsync(ListenerCommand listenerCommand, CancellationToken cancellationToken) { Task <WebSocket> connectTask = this.EnsureConnectTask(cancellationToken); var webSocket = await connectTask.ConfigureAwait(false); using (var stream = new MemoryStream()) { listenerCommand.WriteObject(stream); byte[] buffer = stream.GetBuffer(); using (await this.sendLock.LockAsync(cancellationToken).ConfigureAwait(false)) { await webSocket.SendAsync( new ArraySegment <byte>(buffer, 0, (int)stream.Length), WebSocketMessageType.Binary, true, cancellationToken).ConfigureAwait(false); } } }
internal async Task SendCommandAndStreamAsync(ListenerCommand command, Stream stream, CancellationToken cancelToken) { Task <WebSocket> connectTask = this.EnsureConnectTask(cancelToken); var webSocket = await connectTask.ConfigureAwait(false); using (await this.sendAsyncLock.LockAsync(cancelToken).ConfigureAwait(false)) { // Since we're using the sendBuffer.Array this work needs to be inside the sendAsyncLock. ArraySegment <byte> commandBuffer; using (var commandStream = new MemoryStream(this.sendBuffer.Array, writable: true)) { commandStream.SetLength(0); command.WriteObject(commandStream); commandBuffer = new ArraySegment <byte>(this.sendBuffer.Array, 0, (int)commandStream.Position); } await webSocket.SendAsync(commandBuffer, WebSocketMessageType.Text, true, cancelToken).ConfigureAwait(false); if (stream != null) { await webSocket.SendStreamAsync(stream, WebSocketMessageType.Binary, this.sendBuffer, cancelToken).ConfigureAwait(false); } } }