C# 如何在azure worker角色中同时开始处理任务
我开发了worker角色应用程序来处理不同的任务。例如Task1,task2有100条记录,我在队列中存储了主题,我想同时开始处理,并跨越多个实例的负载 将来会有更多的任务,任务中要处理的记录也会增加。 那么,我如何改进下面的方法来有效地处理记录呢 目前我已经按如下顺序完成了代码C# 如何在azure worker角色中同时开始处理任务,c#,multithreading,azure,azure-worker-roles,C#,Multithreading,Azure,Azure Worker Roles,我开发了worker角色应用程序来处理不同的任务。例如Task1,task2有100条记录,我在队列中存储了主题,我想同时开始处理,并跨越多个实例的负载 将来会有更多的任务,任务中要处理的记录也会增加。 那么,我如何改进下面的方法来有效地处理记录呢 目前我已经按如下顺序完成了代码 private void ProcessTaskQueues() { var currentInterval1 = 0; var maxInterv
private void ProcessTaskQueues()
{
var currentInterval1 = 0;
var maxInterval1 = 15;
var currentInterval2 = 0;
var maxInterval2 = 15;
string queueName1 = RoleEnvironment.GetConfigurationSettingValue("Task1Queue");
CloudQueue queue1 = storageAccount.CreateCloudQueueClient().GetQueueReference(queueName1);
queue1.CreateIfNotExists();
string queueName2 = RoleEnvironment.GetConfigurationSettingValue("Task2Queue");
CloudQueue queue2 = storageAccount.CreateCloudQueueClient().GetQueueReference(queueName2);
queue2.CreateIfNotExists();
while (true)
{
try
{
TaskPerformer tp = new TaskPerformer();
// Task 1
Trace.WriteLine(string.Format("[{0}] - [TASK1] Fetch Message queue", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
var cloudQueueMessage1 = queue1.GetMessage();
if (cloudQueueMessage1 != null)
{
currentInterval1 = 0;
if (cloudQueueMessage1.DequeueCount <= 1)
{
var item = cloudQueueMessage1.FromMessage<Task1Item>();
tp.ExecuteTask1(item);
Trace.WriteLine(string.Format("[{0}] - [TASK1] Message Executed for ID : {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), item.MLPID));
queue2.DeleteMessage(cloudQueueMessage1);
}
}
else
{
if (currentInterval1 < maxInterval1)
{
currentInterval1++;
Trace.WriteLine(string.Format("[{0}] - Waiting for {1} seconds", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), currentInterval1));
}
Thread.Sleep(TimeSpan.FromSeconds(currentInterval1));
}
// Task 2
Trace.WriteLine(string.Format("[{0}] - [TASK2] Fetch Message queue", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")));
var cloudQueueMessage2 = queue2.GetMessage();
if (cloudQueueMessage2 != null)
{
currentInterval2 = 0;
if (cloudQueueMessage2.DequeueCount <= 1)
{
var dns = cloudQueueMessage2.FromMessage<DNS>();
tp.ExecuteTask2(dns);
Trace.WriteLine(string.Format("[{0}] - [TASK2] Message Executed for ID : {1}", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), dns.ID));
queue2.DeleteMessage(cloudQueueMessage2);
}
}
else
{
if (currentInterval2 < maxInterval2)
{
currentInterval2++;
Trace.WriteLine(string.Format("[{0}] - Waiting for {1} seconds", DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"), currentInterval2));
}
Thread.Sleep(TimeSpan.FromSeconds(currentInterval2));
}
}
catch (Exception)
{ }
}
}
从对这个问题的评论中,我找到了一个替代的解决方案,其中只有一个队列用于多种类型的数据项,我在这里得到了这个解决方案
对于每种任务类型,使用不同的队列是否有特定的原因?您可以将所有任务推送到一个队列中,当您获取消息时,您可以从消息中找到任务类型并相应地处理任务。@GauravMantri基本上我有两种不同类型的类和助手方法要转换为二进制&从二进制转换为covert,那么如何映射到队列?i、 e.var item=cloudQueueMessage1.FromMessage;var dns=cloudQueueMessage2.FromMessage