2016-11-30 2 views
2

Я вызываю метод async InsertOperation из метода async ConfigureConnectionString. Я использую 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 - способ настройки поведения клиента очереди для клиента с большим сроком действия. Это имеет смысл, например, если у вас есть экземпляр singleton в вашем приложении. В этом случае вы указываете клиенту, как вы хотите обрабатывать любые сообщения, помещенные в очередь.

В вашем примере, однако, вы создаете клиент, настраиваете OnMessage и не сохраняете клиента, поэтому он фактически ничего не делает.

Смежные вопросы