/// <summary>
        /// Connect to server. Return <c>false</c> if subscribe fails
        /// </summary>
        /// <returns></returns>
        public async Task <bool> SubscribeAsync()
        {
            if (_call == null)
            {
                _ = Task.Run(StartReceivingEvents);
            }
            var request = new SubscribeRequest
            {
                StartStop   = true,
                AccountName = AccountName
            };

            _logControl.LogMessage($"{_clientName} is subscribing to event {request.AccountName}");
            while (_call == null)
            {
                await Task.Delay(10).ConfigureAwait(false);
            }
            try
            {
                await _call.RequestStream.WriteAsync(request);
            }
            catch (RpcException ex)
            {
                _logControl.LogMessage($"{ex.Message}\nRemember to use the StartServer button on FormServer");
                _call = null;
                _removeSubscription(AccountName);
                return(false);
            }
            return(true);
        }
 private async void AccountOnSampleEvent(object sender, SampleEventArgs e)
 {
     try
     {
         _logControl.LogMessage($"Sending {e} to requester={_sampleEventKey}");
         var args = e.ToSampleEventArgsMessage();
         await _responseStream.WriteAsync(args);
     }
     catch (Exception ex)
     {
         // Eo graceful recovery when client has disappeared
         _logControl.LogMessage($"Exception: {ex.Message}");
         _removeAction(_sampleEventKey);
         Dispose();
     }
 }
        public override async Task Subscribe(IAsyncStreamReader <SubscribeRequest> requestStream, IServerStreamWriter <SampleEventArgsMessage> responseStream, ServerCallContext context)
        {
            var requesterHeader = context.RequestHeaders.FirstOrDefault(x => x.Key == Constants.Requester.ToLower()); // Must be lower case. Ugh!
            var peer            = context.Peer;
            var requester       = requesterHeader == null ? $"Anonymous@{peer}" : $"{requesterHeader.Value}@{peer}";

            while (await requestStream.MoveNext())
            {
                var request = requestStream.Current;
                var key     = new SampleEventKey(request.AccountName, requester);
                if (request.StartStop)
                {
                    var writer = new AccountSampleEventWriter(key, responseStream, _logControl, RemoveWriter);
                    _eventWriters.TryAdd(key, writer);
                    OnAccountNameAdded(request.AccountName);
                    _logControl.LogMessage($"Added subscription to SampleEvents for {AccountNameAdded}");
                }
                else
                {
                    RemoveWriter(key);
                    return;
                }
            }
        }