2016-11-30 34 views
2

我从异步方法ConfigureConnectionString调用异步方法InsertOperation。我是否正确使用client.OnMessage调用?我想异步处理队列中的消息,然后将它们存储到队列存储中。在异步方法中使用QueueClient.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 
      }; 
     }); 
    } 
+0

您的代码就其本身而言有点令人困惑 - 例如,您不使用传递给InsertOperation的表变量。你能解释你想达到的逻辑吗? – PartlyCloudy

回答

1

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

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

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

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

但是,在您的示例中,您将创建客户端,设置OnMessage并且不会持久客户端,因此它实际上不会实现任何功能。

相关问题