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.Api/Grpc.Core.Api.csproj b/src/csharp/Grpc.Core.Api/Grpc.Core.Api.csproj
index a0d41a260daeb..ae6bea8bd16dd 100755
--- a/src/csharp/Grpc.Core.Api/Grpc.Core.Api.csproj
+++ b/src/csharp/Grpc.Core.Api/Grpc.Core.Api.csproj
@@ -23,7 +23,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 b7c7851a34bd7..561c3edc9cc7c 100755
--- a/src/csharp/Grpc.Core/Grpc.Core.csproj
+++ b/src/csharp/Grpc.Core/Grpc.Core.csproj
@@ -1,4 +1,4 @@
-
+
@@ -98,7 +98,6 @@
-
diff --git a/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs b/src/csharp/Grpc.Reflection.Tests/ReflectionClientServerTest.cs
index 76f8cfadcfd4d..b77f245667c09 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");