From a0aa16a0787e0f20515bb49fc708ea9e4ee7871b Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 17 May 2019 15:58:10 +1200 Subject: [PATCH 1/3] Remove System.Interactive.Async dependency --- src/csharp/Grpc.Core.Api/Grpc.Core.Api.csproj | 4 -- .../Grpc.Core.Api/IAsyncStreamReader.cs | 22 +++++--- src/csharp/Grpc.Core/Grpc.Core.csproj | 6 +-- .../Grpc.Core/Utils/AsyncStreamExtensions.cs | 53 +++++++++++++++++++ .../ReflectionClientServerTest.cs | 3 +- 5 files changed, 72 insertions(+), 16 deletions(-) diff --git a/src/csharp/Grpc.Core.Api/Grpc.Core.Api.csproj b/src/csharp/Grpc.Core.Api/Grpc.Core.Api.csproj index 8a32bc757df1c..7d9a236284d69 100755 --- a/src/csharp/Grpc.Core.Api/Grpc.Core.Api.csproj +++ b/src/csharp/Grpc.Core.Api/Grpc.Core.Api.csproj @@ -25,10 +25,6 @@ - - - - diff --git a/src/csharp/Grpc.Core.Api/IAsyncStreamReader.cs b/src/csharp/Grpc.Core.Api/IAsyncStreamReader.cs index 3751d549e396e..7ad4f2687b8db 100644 --- a/src/csharp/Grpc.Core.Api/IAsyncStreamReader.cs +++ b/src/csharp/Grpc.Core.Api/IAsyncStreamReader.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2015 gRPC authors. // @@ -16,10 +16,7 @@ #endregion -using System; -using System.Collections.Generic; -using System.Linq; -using System.Text; +using System.Threading; using System.Threading.Tasks; namespace Grpc.Core @@ -50,7 +47,20 @@ namespace Grpc.Core /// /// /// The message type. - public interface IAsyncStreamReader : IAsyncEnumerator + public interface IAsyncStreamReader { + /// + /// Gets the current element in the iteration. + /// + T Current { get; } + + /// + /// Advances the reader to the next element in the sequence, returning the result asynchronously. + /// + /// Cancellation token that can be used to cancel the operation. + /// + /// Task containing the result of the operation: true if the reader was successfully advanced + /// to the next element; false if the reader has passed the end of the sequence. + Task MoveNext(CancellationToken cancellationToken); } } diff --git a/src/csharp/Grpc.Core/Grpc.Core.csproj b/src/csharp/Grpc.Core/Grpc.Core.csproj index afd60e73a214c..78392e9df58aa 100755 --- a/src/csharp/Grpc.Core/Grpc.Core.csproj +++ b/src/csharp/Grpc.Core/Grpc.Core.csproj @@ -1,4 +1,4 @@ - + @@ -98,10 +98,6 @@ - - - - diff --git a/src/csharp/Grpc.Core/Utils/AsyncStreamExtensions.cs b/src/csharp/Grpc.Core/Utils/AsyncStreamExtensions.cs index fce53c700749c..6ca72a1139b01 100644 --- a/src/csharp/Grpc.Core/Utils/AsyncStreamExtensions.cs +++ b/src/csharp/Grpc.Core/Utils/AsyncStreamExtensions.cs @@ -18,6 +18,7 @@ using System; using System.Collections.Generic; +using System.Threading; using System.Threading.Tasks; namespace Grpc.Core.Utils @@ -27,12 +28,41 @@ namespace Grpc.Core.Utils /// public static class AsyncStreamExtensions { + /// + /// Advances the stream reader to the next element in the sequence, returning the result asynchronously. + /// + /// The message type. + /// The stream reader. + /// + /// Task containing the result of the operation: true if the reader was successfully advanced + /// to the next element; false if the reader has passed the end of the sequence. + /// + public static Task MoveNext(this IAsyncStreamReader streamReader) + where T : class + { + if (streamReader == null) + { + throw new ArgumentNullException(nameof(streamReader)); + } + + return streamReader.MoveNext(CancellationToken.None); + } + /// /// Reads the entire stream and executes an async action for each element. /// public static async Task ForEachAsync(this IAsyncStreamReader streamReader, Func asyncAction) where T : class { + if (streamReader == null) + { + throw new ArgumentNullException(nameof(streamReader)); + } + if (asyncAction == null) + { + throw new ArgumentNullException(nameof(asyncAction)); + } + while (await streamReader.MoveNext().ConfigureAwait(false)) { await asyncAction(streamReader.Current).ConfigureAwait(false); @@ -45,6 +75,11 @@ public static async Task ForEachAsync(this IAsyncStreamReader streamReader public static async Task> ToListAsync(this IAsyncStreamReader streamReader) where T : class { + if (streamReader == null) + { + throw new ArgumentNullException(nameof(streamReader)); + } + var result = new List(); while (await streamReader.MoveNext().ConfigureAwait(false)) { @@ -60,6 +95,15 @@ public static async Task> ToListAsync(this IAsyncStreamReader stre public static async Task WriteAllAsync(this IClientStreamWriter streamWriter, IEnumerable elements, bool complete = true) where T : class { + if (streamWriter == null) + { + throw new ArgumentNullException(nameof(streamWriter)); + } + if (elements == null) + { + throw new ArgumentNullException(nameof(elements)); + } + foreach (var element in elements) { await streamWriter.WriteAsync(element).ConfigureAwait(false); @@ -76,6 +120,15 @@ public static async Task WriteAllAsync(this IClientStreamWriter streamWrit public static async Task WriteAllAsync(this IServerStreamWriter streamWriter, IEnumerable elements) where T : class { + if (streamWriter == null) + { + throw new ArgumentNullException(nameof(streamWriter)); + } + if (elements == null) + { + throw new ArgumentNullException(nameof(elements)); + } + foreach (var element in elements) { await streamWriter.WriteAsync(element).ConfigureAwait(false); diff --git a/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs b/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs index 76f8cfadcfd4d..9ef9680f71c3d 100644 --- a/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs +++ b/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs @@ -1,4 +1,4 @@ -#region Copyright notice and license +#region Copyright notice and license // Copyright 2015 gRPC authors. // // Licensed under the Apache License, Version 2.0 (the "License"); @@ -21,6 +21,7 @@ using System.Threading.Tasks; using Grpc.Core; +using Grpc.Core.Utils; using Grpc.Reflection; using Grpc.Reflection.V1Alpha; using NUnit.Framework; From 47660b784b3b6a15e12a2718a7df758cb70f6dc5 Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 17 May 2019 16:21:08 +1200 Subject: [PATCH 2/3] Add missing namespace --- src/csharp/Grpc.Core.Tests/Internal/AsyncCallServerTest.cs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallServerTest.cs b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallServerTest.cs index fd221613c04c9..d343271ffbe16 100644 --- a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallServerTest.cs +++ b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallServerTest.cs @@ -23,6 +23,7 @@ using System.Threading.Tasks; using Grpc.Core.Internal; +using Grpc.Core.Utils; using NUnit.Framework; namespace Grpc.Core.Internal.Tests From 44bc1cdaeb282f1ed80f2e905598a880b5fd340c Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Mon, 20 May 2019 21:26:03 +1200 Subject: [PATCH 3/3] PR feedback --- .../AsyncStreamReaderExtensions.cs | 50 +++++++++++++++++ .../Internal/AsyncCallServerTest.cs | 1 - .../Grpc.Core/Utils/AsyncStreamExtensions.cs | 53 ------------------- .../ReflectionClientServerTest.cs | 1 - 4 files changed, 50 insertions(+), 55 deletions(-) create mode 100644 src/csharp/Grpc.Core.Api/AsyncStreamReaderExtensions.cs diff --git a/src/csharp/Grpc.Core.Api/AsyncStreamReaderExtensions.cs b/src/csharp/Grpc.Core.Api/AsyncStreamReaderExtensions.cs new file mode 100644 index 0000000000000..a1f895723ed02 --- /dev/null +++ b/src/csharp/Grpc.Core.Api/AsyncStreamReaderExtensions.cs @@ -0,0 +1,50 @@ +#region Copyright notice and license + +// Copyright 2015 gRPC authors. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#endregion + +using System; +using System.Threading; +using System.Threading.Tasks; + +namespace Grpc.Core +{ + /// + /// Extension methods for . + /// + public static class AsyncStreamReaderExtensions + { + /// + /// Advances the stream reader to the next element in the sequence, returning the result asynchronously. + /// + /// The message type. + /// The stream reader. + /// + /// Task containing the result of the operation: true if the reader was successfully advanced + /// to the next element; false if the reader has passed the end of the sequence. + /// + public static Task MoveNext(this IAsyncStreamReader streamReader) + where T : class + { + if (streamReader == null) + { + throw new ArgumentNullException(nameof(streamReader)); + } + + return streamReader.MoveNext(CancellationToken.None); + } + } +} diff --git a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallServerTest.cs b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallServerTest.cs index d343271ffbe16..fd221613c04c9 100644 --- a/src/csharp/Grpc.Core.Tests/Internal/AsyncCallServerTest.cs +++ b/src/csharp/Grpc.Core.Tests/Internal/AsyncCallServerTest.cs @@ -23,7 +23,6 @@ using System.Threading.Tasks; using Grpc.Core.Internal; -using Grpc.Core.Utils; using NUnit.Framework; namespace Grpc.Core.Internal.Tests diff --git a/src/csharp/Grpc.Core/Utils/AsyncStreamExtensions.cs b/src/csharp/Grpc.Core/Utils/AsyncStreamExtensions.cs index 6ca72a1139b01..fce53c700749c 100644 --- a/src/csharp/Grpc.Core/Utils/AsyncStreamExtensions.cs +++ b/src/csharp/Grpc.Core/Utils/AsyncStreamExtensions.cs @@ -18,7 +18,6 @@ using System; using System.Collections.Generic; -using System.Threading; using System.Threading.Tasks; namespace Grpc.Core.Utils @@ -28,41 +27,12 @@ namespace Grpc.Core.Utils /// public static class AsyncStreamExtensions { - /// - /// Advances the stream reader to the next element in the sequence, returning the result asynchronously. - /// - /// The message type. - /// The stream reader. - /// - /// Task containing the result of the operation: true if the reader was successfully advanced - /// to the next element; false if the reader has passed the end of the sequence. - /// - public static Task MoveNext(this IAsyncStreamReader streamReader) - where T : class - { - if (streamReader == null) - { - throw new ArgumentNullException(nameof(streamReader)); - } - - return streamReader.MoveNext(CancellationToken.None); - } - /// /// Reads the entire stream and executes an async action for each element. /// public static async Task ForEachAsync(this IAsyncStreamReader streamReader, Func asyncAction) where T : class { - if (streamReader == null) - { - throw new ArgumentNullException(nameof(streamReader)); - } - if (asyncAction == null) - { - throw new ArgumentNullException(nameof(asyncAction)); - } - while (await streamReader.MoveNext().ConfigureAwait(false)) { await asyncAction(streamReader.Current).ConfigureAwait(false); @@ -75,11 +45,6 @@ public static async Task ForEachAsync(this IAsyncStreamReader streamReader public static async Task> ToListAsync(this IAsyncStreamReader streamReader) where T : class { - if (streamReader == null) - { - throw new ArgumentNullException(nameof(streamReader)); - } - var result = new List(); while (await streamReader.MoveNext().ConfigureAwait(false)) { @@ -95,15 +60,6 @@ public static async Task> ToListAsync(this IAsyncStreamReader stre public static async Task WriteAllAsync(this IClientStreamWriter streamWriter, IEnumerable elements, bool complete = true) where T : class { - if (streamWriter == null) - { - throw new ArgumentNullException(nameof(streamWriter)); - } - if (elements == null) - { - throw new ArgumentNullException(nameof(elements)); - } - foreach (var element in elements) { await streamWriter.WriteAsync(element).ConfigureAwait(false); @@ -120,15 +76,6 @@ public static async Task WriteAllAsync(this IClientStreamWriter streamWrit public static async Task WriteAllAsync(this IServerStreamWriter streamWriter, IEnumerable elements) where T : class { - if (streamWriter == null) - { - throw new ArgumentNullException(nameof(streamWriter)); - } - if (elements == null) - { - throw new ArgumentNullException(nameof(elements)); - } - foreach (var element in elements) { await streamWriter.WriteAsync(element).ConfigureAwait(false); diff --git a/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs b/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs index 9ef9680f71c3d..b77f245667c09 100644 --- a/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs +++ b/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs @@ -21,7 +21,6 @@ using System.Threading.Tasks; using Grpc.Core; -using Grpc.Core.Utils; using Grpc.Reflection; using Grpc.Reflection.V1Alpha; using NUnit.Framework;