在异步方法中使用QueueClient.OnMessage是否有意义?

时间:2016-11-30 17:28:07

标签: azure asynchronous azure-storage azureservicebus

我从异步方法ConfigureConnectionString调用异步方法InsertOperation。我是否正确使用client.OnMessage?我想异步处理队列中的消息,然后将它们存储到队列存储中。

private static async void ConfigureConnectionString()
    {
        var connectionString =
           "myconnstring";
        var queueName = "myqueue";

        CloudStorageAccount storageAccount = CloudStorageAccount.Parse(CloudConfigurationManager.GetSetting("StorageConnectionString"));
        CloudTableClient tableClient = storageAccount.CreateCloudTableClient();

        CloudTable table = tableClient.GetTableReference("test");
        table.CreateIfNotExists();
        Stopwatch sw = Stopwatch.StartNew();
        await Task.Run(() => InsertOperation(connectionString, queueName, table));
        sw.Stop();
        Console.WriteLine("ElapsedTime " + sw.Elapsed.TotalMinutes + " minutes.");

    }


 private static async Task InsertOperation(string connectionString, string queueName, CloudTable table)
    {

        var client = QueueClient.CreateFromConnectionString(connectionString, queueName);
        client.OnMessage(message =>
        {

            var bodyJson = new StreamReader(message.GetBody<Stream>(), Encoding.UTF8).ReadToEnd();
            var myMessage = JsonConvert.DeserializeObject<VerifyVariable>(bodyJson);

            Console.WriteLine();

            var VerifyVariableEntityObject = new VerifyVariableEntity()
            {
                ConsumerId = myMessage.ConsumerId,
                Score = myMessage.Score,
                PartitionKey = myMessage.ConsumerId,
                RowKey = myMessage.Score
            };
        });
    }

2 个答案:

答案 0 :(得分:1)

OnMessageAsync method提供了异步编程模型,它使我们能够异步处理消息。

client.OnMessageAsync(message =>
{
    return Task.Factory.StartNew(() => ProcessMessage(message));
    //you could perofrm table and queue storage in ProcessMessage method
}, options);

答案 1 :(得分:0)

如果不了解您想要实现的实际逻辑,看起来您没有正确使用OnMessage。

OnMessage是一种为长时间运行的客户端设置队列客户端行为的方法。例如,如果您的应用程序中有单例实例,这是有道理的。在这种情况下,您要向客户端指定如何处理放入队列中的任何消息。

但是,在您的示例中,您创建客户端,设置OnMessage,并且不保留客户端,因此它实际上无法完成任何任务。