Azure Service Bus: reciba mensajes con el método OnMessage ()

Siguiendo elDocumentación de MS no fue difícil recibir mensajes de suscripción. Sin embargo, si quisiera que mi aplicación reciba un mensaje cada vez que se publica un mensaje nuevo, un sondeo constante. Por lo tanto, laOnMessage () método de laSubscriptionClient clase.

Documentación de MS dice: "... Al llamar a OnMessage, el cliente inicia una bomba de mensajes interna que sondea constantemente la cola o la suscripción. Esta bomba de mensajes consta de un bucle infinito que emite una llamada de recepción (). Si la llamada agota el tiempo de espera, emite la próxima llamada de Recibir (). ..."

Pero cuando la aplicación se está ejecutando, el momentoOnMessage () Se llama al método solo se reciben los últimos mensajes. Cuando se publican nuevos mensajes, el sondeo constante no parece funcionar. Después de probar muchos enfoques diferentesla única forma en que podría hacer que esto funcione y hacer que la aplicación reaccione en el momento en que se reciba un nuevo mensaje es colocar el código en una tarea separada con bucle infinito. ¡Esto parece totalmente incorrecto en tantos niveles! (ver código a continuación).

¿Alguien puede ayudarme a corregir mi código o publicar una muestra funcional para lograr la misma funcionalidad sin el bucle? ¡Gracias!

 public void ReceiveMessageFromSubscription(string topicName, string subscriptionFilter)
        {
            var newMessage = new MessageQueue();
            int i = 0;

            Task listener = Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    SubscriptionClient Client = SubscriptionClient.CreateFromConnectionString(connectionString, topicName, subscriptionFilter);

                    Dictionary<string, string> retrievedMessage = new Dictionary<string, string>();

                    OnMessageOptions options = new OnMessageOptions();
                                     options.AutoComplete = false;
                                     options.AutoRenewTimeout = TimeSpan.FromMinutes(1);

                    Client.OnMessage((message) =>
                    {
                        try
                        {
                            retrievedMessage.Add("messageGuid", message.Properties["MessageGuid"].ToString());
                            retrievedMessage.Add("instanceId", message.Properties["InstanceId"].ToString());
                            retrievedMessage.Add("pId", message.Properties["ProcessId"].ToString());
                            retrievedMessage.Add("processKey", message.Properties["ProcessKey"].ToString());
                            retrievedMessage.Add("message", message.Properties["Message"].ToString());

                            newMessage.AnnounceNewMessage(retrievedMessage); // event ->

                            message.Complete(); // Remove message from subscription.
                        }
                        catch (Exception ex)
                        {
                            string exmes = ex.Message;
                            message.Abandon();
                        }

                    }, options);

                    retrievedMessage.Clear();

                    i++;

                    Thread.Sleep(3000);
                }

            });
        }

Respuestas a la pregunta(1)

Su respuesta a la pregunta