Azure';s QueueClient.ReceiveMessagesSync在没有消息时返回

Azure';s QueueClient.ReceiveMessagesSync在没有消息时返回,azure,azure-storage-queues,Azure,Azure Storage Queues,我正在使用,我注意到我的成本很高,尽管我的队列中没有很多物品。当我分析指标时,我还注意到队列上的高带宽。经过一些调查后,我注意到我的代码中有一些错误。我使用以下循环: private async Task ProcessEventsAsync(CancellationToken cancellationToken) { while (!cancellationToken.IsCancellationRequested) { var messages = await _queueC

我正在使用,我注意到我的成本很高,尽管我的队列中没有很多物品。当我分析指标时,我还注意到队列上的高带宽。经过一些调查后,我注意到我的代码中有一些错误。我使用以下循环:

private async Task ProcessEventsAsync(CancellationToken cancellationToken)
{
  while (!cancellationToken.IsCancellationRequested)
  {
    var messages = await _queueClient.ReceiveMessagesAsync(maxMessages: 10, cancellationToken: cancellationToken).ConfigureAwait(false);
    foreach (var message in messages.Value)
    {
      // Event handling here...
      await _queueClient.DeleteMessageAsync(message.MessageId, message.PopReceipt, cancellationToken: CancellationToken.None).ConfigureAwait(false);
    }
  }
}
看起来该方法在队列中没有消息时也会返回。这导致我的代码不断循环,消耗了大量的CPU和带宽

我希望此调用将被阻止,直到队列中至少有一条消息。本文件对此方法有以下说明:

从队列前端接收一条或多条消息


这表明它会阻塞,直到至少有一条消息可用为止。另一种选择是每隔几秒钟轮询一次队列,但我宁愿不轮询队列。要获得适当的响应时间,我需要经常轮询。

这不是存储队列的使用方式
ReceiveMessagesAsync
每次调用blob存储队列时,都会向其发出HTTP请求

Azure.Storage.Queues
SDK中没有允许它像消息调度器一样工作的机制

如果您想要这种行为,您应该查看
Azure事件中心
。这就是它的用途:在集线器上侦听消息,当消息可用时,它会在您的服务中触发事件,然后您对其进行处理


如果您无法使用存储队列,那么我强烈建议您在每个循环之间执行
等待任务。延迟(5000,令牌)
。这将大大减少您产生的通信量,降低您的成本。

我认为应该更改文档,因此它声明“从队列前端接收零条或更多消息”。应添加一条备注,即当队列中没有消息时,此方法将立即返回。在处理队列时,receive方法通常会阻塞队列,直到消息可用。我将检查Azure服务总线队列是否符合我的需要。我想事件中心更适合将事件分发给不同的目标。我只需要队列功能。@RamondeKlein——您可以用同样的方式使用事件集线器。这很容易接线。您只需创建一个客户机并将一个委托绑定到它,它就会启动。“我一直在使用它们,而且它们没有任何问题。”拉蒙德克莱因——另外,请记住,在一个循环中暂停2-5秒并不是一个糟糕的主意。所有邮件分派器都轮询更改。。。在某些事情上,比如更改提要通知程序或事件中心通知程序(SDK或后端中有代码可以为您执行此操作),您就是看不到它。他们只是希望您使用此方法进行轮询。