Skip to content

Commit eb05af3

Browse files
GimlyIEvangelist
andauthored
Update client-libraries.md (#19952)
* Update client-libraries.md Fixes a few issues in the `Observable` code sample, there was a missing generic definition in the `GrpcStreamSubscription`. Removes the `Debug.Assert` and use argument exceptions instead. Few other cosmetic changes. * Update client-libraries.md Fix linting issues * Update client-libraries.md Forgot a `_` before the observer * Update client-libraries.md Fix mix up with the cancellation token * Remove redundant code Co-authored-by: David Pine <david.pine@microsoft.com> Co-authored-by: David Pine <david.pine@microsoft.com>
1 parent 21397c8 commit eb05af3

File tree

1 file changed

+24
-19
lines changed

1 file changed

+24
-19
lines changed

docs/architecture/grpc-for-wcf-developers/client-libraries.md

Lines changed: 24 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -29,9 +29,7 @@ This code is longer than the `IAsyncEnumerable<T>` code, because C# doesn't have
2929

3030
```csharp
3131
using System;
32-
using System.Diagnostics;
3332
using System.Threading;
34-
using System.Threading.Tasks;
3533

3634
namespace Grpc.Core
3735
{
@@ -43,14 +41,14 @@ namespace Grpc.Core
4341

4442
public GrpcStreamObservable(IAsyncStreamReader<T> reader, CancellationToken token = default)
4543
{
46-
_reader = reader;
44+
_reader = reader ?? throw new ArgumentNullException(nameof(reader));
4745
_token = token;
4846
_used = 0;
4947
}
5048

5149
public IDisposable Subscribe(IObserver<T> observer) =>
5250
Interlocked.Exchange(ref _used, 1) == 0
53-
? new GrpcStreamSubscription(_reader, observer, _token)
51+
? new GrpcStreamSubscription<T>(_reader, observer, _token)
5452
: throw new InvalidOperationException("Subscribe can only be called once.");
5553

5654
}
@@ -63,28 +61,35 @@ namespace Grpc.Core
6361
The `GrpcStreamSubscription` class handles the enumeration of the `IAsyncStreamReader`:
6462

6563
```csharp
66-
public class GrpcStreamSubscription : IDisposable
64+
public class GrpcStreamSubscription<T> : IDisposable
6765
{
68-
private readonly Task _task;
66+
private readonly IAsyncStreamReader<T> _reader;
67+
private readonly IObserver<T> _observer;
68+
6969
private readonly CancellationTokenSource _tokenSource;
70+
71+
private readonly Task _task;
72+
7073
private bool _completed;
7174

72-
public GrpcStreamSubscription(IAsyncStreamReader<T> reader, IObserver<T> observer, CancellationToken token)
75+
public GrpcStreamSubscription(IAsyncStreamReader<T> reader, IObserver<T> observer, CancellationToken token = default)
7376
{
74-
Debug.Assert(reader != null);
75-
Debug.Assert(observer != null);
77+
_reader = reader ?? throw new ArgumentNullException(nameof(reader));
78+
_observer = observer ?? throw new ArgumentNullException(nameof(observer));
79+
7680
_tokenSource = new CancellationTokenSource();
7781
token.Register(_tokenSource.Cancel);
78-
_task = Run(reader, observer, _tokenSource.Token);
82+
83+
_task = Run(_tokenSource.Token);
7984
}
8085

81-
private async Task Run(IAsyncStreamReader<T> reader, IObserver<T> observer, CancellationToken token)
86+
private async Task Run(CancellationToken token)
8287
{
8388
while (!token.IsCancellationRequested)
8489
{
8590
try
8691
{
87-
if (!await reader.MoveNext(token)) break;
92+
if (!await _reader.MoveNext(token)) break;
8893
}
8994
catch (RpcException e) when (e.StatusCode == Grpc.Core.StatusCode.NotFound)
9095
{
@@ -96,16 +101,16 @@ public class GrpcStreamSubscription : IDisposable
96101
}
97102
catch (Exception e)
98103
{
99-
observer.OnError(e);
104+
_observer.OnError(e);
100105
_completed = true;
101106
return;
102107
}
103108

104-
observer.OnNext(reader.Current);
109+
_observer.OnNext(_reader.Current);
105110
}
106111

107112
_completed = true;
108-
observer.OnCompleted();
113+
_observer.OnCompleted();
109114
}
110115

111116
public void Dispose()
@@ -126,16 +131,16 @@ All that is required now is a simple extension method to create the observable f
126131

127132
```csharp
128133
using System;
129-
using System.Diagnostics;
130134
using System.Threading;
131-
using System.Threading.Tasks;
132135

133136
namespace Grpc.Core
134137
{
135138
public static class AsyncStreamReaderObservableExtensions
136139
{
137-
public static IObservable<T> AsObservable<T>(this IAsyncStreamReader<T> reader) =>
138-
new GrpcStreamObservable<T>(reader);
140+
public static IObservable<T> AsObservable<T>(
141+
this IAsyncStreamReader<T> reader,
142+
CancellationToken cancellationToken = default) =>
143+
new GrpcStreamObservable<T>(reader, cancellationToken);
139144
}
140145
}
141146
```

0 commit comments

Comments
 (0)