diff --git a/src/Docker.DotNet/DockerClient.cs b/src/Docker.DotNet/DockerClient.cs index c685a6909..e00e6e27d 100644 --- a/src/Docker.DotNet/DockerClient.cs +++ b/src/Docker.DotNet/DockerClient.cs @@ -75,7 +75,11 @@ internal DockerClient(DockerClientConfiguration configuration, Version requested // NamedPipeClientStream handles file not found by polling until the server arrives. Use a short // timeout so that the user doesn't get stuck waiting for a dockerd instance that is not running. var timeout = 100; // 100ms - var stream = new NamedPipeClientStream(serverName, pipeName); + var stream = new NamedPipeClientStream( + serverName, + pipeName, + PipeDirection.InOut, + PipeOptions.Asynchronous); var dockerStream = new DockerPipeStream(stream); #if NET45 diff --git a/src/Docker.DotNet/Microsoft.Net.Http.Client/BufferedReadStream.cs b/src/Docker.DotNet/Microsoft.Net.Http.Client/BufferedReadStream.cs index 0ebc0c053..729712a3c 100644 --- a/src/Docker.DotNet/Microsoft.Net.Http.Client/BufferedReadStream.cs +++ b/src/Docker.DotNet/Microsoft.Net.Http.Client/BufferedReadStream.cs @@ -160,6 +160,9 @@ private async Task EnsureBufferedAsync(CancellationToken cancel) { _bufferOffset = 0; _bufferCount = await _inner.ReadAsync(_buffer, _bufferOffset, _buffer.Length, cancel).ConfigureAwait(false); + + ThrowIfDisposed(); + if (_bufferCount == 0) { throw new IOException("Unexpected end of stream"); diff --git a/test/Docker.DotNet.Tests/ISystemOperations.Tests.cs b/test/Docker.DotNet.Tests/ISystemOperations.Tests.cs index ac5a73372..6562c3801 100644 --- a/test/Docker.DotNet.Tests/ISystemOperations.Tests.cs +++ b/test/Docker.DotNet.Tests/ISystemOperations.Tests.cs @@ -90,6 +90,17 @@ public async Task MonitorEventsAsync_Succeeds() await _client.Images.DeleteImageAsync($"{repository}:{tag}", new ImageDeleteParameters()); } + [Fact] + public async Task MonitorEventsAsync_EmptyContainersList_CanBeCancelled() + { + var cts = new CancellationTokenSource(); + cts.CancelAfter(1000); + + var task = _client.System.MonitorEventsAsync(new ContainerEventsParameters(), new Progress(), cts.Token); + + await task; + } + class Progress : IProgress { internal Action _onCalled;