2016-11-30 72 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並且不會持久客戶端,因此它實際上不會實現任何功能。

相關問題