Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 获取、处理和删除所有队列消息,而不是逐个执行?_C#_Azure - Fatal编程技术网

C# 获取、处理和删除所有队列消息,而不是逐个执行?

C# 获取、处理和删除所有队列消息,而不是逐个执行?,c#,azure,C#,Azure,我正在Azure队列上工作。我需要获取、处理和删除所有队列消息。我现在正在做的是调用GetMessage,处理消息并逐个调用DeleteMessage var message = _queue.GetMessage(); if (message == null) { return; } // processs _queue.DeleteMessage(message); 有没有办法先获取所有消息,然后再对其进行处理并删除所有这些已处理的消息?您无法在一次呼叫中从队列中获取所有消息

我正在Azure队列上工作。我需要获取、处理和删除所有队列消息。我现在正在做的是调用GetMessage,处理消息并逐个调用DeleteMessage

var message = _queue.GetMessage();
if (message == null)
{
     return;
}
// processs
 _queue.DeleteMessage(message); 

有没有办法先获取所有消息,然后再对其进行处理并删除所有这些已处理的消息?

您无法在一次呼叫中从队列中获取所有消息<代码>在一次呼叫中,您可以从队列中获得的最大消息数为32。所以你需要做的是:

var messages = _queue.GetMessages(32);
然后处理这些消息,而不是一次只收到一条消息

更新

根据你的评论,有几件事:

  • 队列有一个名为的属性,它将告诉您队列中大约有多少条消息。这会让您了解消息的总数
  • 您不能一次删除32封邮件。您需要一次删除一封邮件
基于这些,请看下面的伪代码:

            do
            {
                var messages = _queue.GetMessages(32);
                foreach (var msg in messages)
                {
                    ProcessMessage(msg);
                    DeleteMessage(msg);
                }
                var approximateMessagesCount = _queue.FetchAttributes().ApproximateMessageCount.Value;
                if (approximateMessagesCount == 0)
                {
                    break;
                }
            } while (true);

基本上,您必须继续从队列中获取消息(一次32条),处理单个消息,然后在处理完消息后将其删除。处理并删除这32条消息后,您必须检查队列中是否还有其他消息。如果有消息,请重复此过程。如果没有消息,那么您将退出循环

我不确定队列中有多少条消息。您能举一个示例来获取所有消息(使用32个批中的_queue.GetMessages)并处理和删除吗?我们可以一次删除32条消息吗?更新了我的答案。很好,谢谢。但仍有问题需要解决。如果应用程序持续排队会怎么样。表示while循环将一直运行,直到应用程序停止排队。MaximumMessagesToProcessPerBatch可能在这里起作用。我认为最好是检查messages.Count()而不是ApproximateMessageCount,因为已经有messages对象。没有?我同意你的意见。该代码只是一个伪代码,用于解释如何从队列中获取和处理所有消息。通常,您希望将消息处理分布到多个节点,其中每个节点处理有限数量的消息。