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