public async Task Subscribe(EventsSubscribeRequest request, ReceiveEventsMessage messageHandler, ReceiveEventsError errorHandler, CancellationToken cancellationToken = new CancellationToken()) { request.ClientId = this.ClientOptions.PopulateClientId(request.ClientId); request.Validate(); if (messageHandler == null) { throw new ArgumentNullException(nameof(messageHandler), "request must have a non-null message delegate"); } if (errorHandler == null) { throw new ArgumentNullException(nameof(messageHandler), "request must have a non-null error delegate"); } while (true) { try { using (var call = Client.SubscribeToEvents(request.ToSubscribeRequest(), ClientOptions.GetGrpcMetadata(), null, cancellationToken)) { while (await call.ResponseStream.MoveNext()) { EventsReceiveMessage message = new EventsReceiveMessage(call.ResponseStream.Current); messageHandler(message); } } } catch (RpcException rpcx) { if (rpcx.StatusCode == StatusCode.Cancelled) { break; } else { errorHandler(rpcx.Message); } } catch (Exception e) { errorHandler(e.Message); } await Task.Delay(ClientOptions.ReconnectInterval); } }