private async Task WriteCoreAsync <T>(T message, Func <T, Task> task) where T : ServiceMessage, IMessageWithTracingId
 {
     try
     {
         await task(message);
     }
     catch (Exception ex)
     {
         MessageLog.FailedToSendMessage(Logger, message, ex);
         throw;
     }
     if (message.TracingId != null)
     {
         MessageLog.SucceededToSendMessage(Logger, message);
     }
 }
        private async Task <bool> WriteAckableCoreAsync <T>(T message, Func <T, Task <bool> > task) where T : ServiceMessage, IMessageWithTracingId
        {
            try
            {
                var result = await task(message);

                if (message.TracingId != null)
                {
                    MessageLog.SucceededToSendMessage(Logger, message);
                }
                return(result);
            }
            catch (Exception ex)
            {
                MessageLog.FailedToSendMessage(Logger, message, ex);
                throw;
            }
        }
        public override async Task SendConnectionAsync(string connectionId, string methodName, object[] args, CancellationToken cancellationToken = default)
        {
            if (IsInvalidArgument(connectionId))
            {
                throw new ArgumentException(NullOrEmptyStringErrorMessage, nameof(connectionId));
            }

            if (IsInvalidArgument(methodName))
            {
                throw new ArgumentException(NullOrEmptyStringErrorMessage, nameof(methodName));
            }

            if (_clientConnectionManager.ClientConnections.TryGetValue(connectionId, out var serviceConnectionContext))
            {
                var message = new MultiConnectionDataMessage(new[] { connectionId }, SerializeAllProtocols(methodName, args)).WithTracingId();
                if (message.TracingId != null)
                {
                    MessageLog.StartToSendMessageToConnections(Logger, message);
                }

                try
                {
                    // Write directly to this connection
                    await serviceConnectionContext.ServiceConnection.WriteAsync(message);

                    if (message.TracingId != null)
                    {
                        MessageLog.SucceededToSendMessage(Logger, message);
                    }
                    return;
                }
                catch (Exception ex)
                {
                    MessageLog.FailedToSendMessage(Logger, message, ex);
                    throw;
                }
            }

            await base.SendConnectionAsync(connectionId, methodName, args, cancellationToken);
        }