我从异步方法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
};
});
}
答案 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,并且不保留客户端,因此它实际上无法完成任何任务。