C# CloudQueueMessage重复项

C# CloudQueueMessage重复项,c#,azure,C#,Azure,我创建了一个具有主任务和两个侦听器工作角色的计划任务: 我的侦听器项目有两个实例。是什么阻止两个工作者角色两次获得相同的消息 这是我的密码: public override void Run() { // This is a sample worker implementation. Replace with your logic. //Trace.TraceInformation("CloudCartConnector.TaskRole entr

我创建了一个具有主任务和两个侦听器工作角色的计划任务:

我的侦听器项目有两个实例。是什么阻止两个工作者角色两次获得相同的消息

这是我的密码:

    public override void Run()
    {
        // This is a sample worker implementation. Replace with your logic.
        //Trace.TraceInformation("CloudCartConnector.TaskRole entry point called", "Information");
        while (true)
        {
            ExecuteTask();
            Thread.Sleep(30000);
            Trace.TraceInformation("Working", "Information");
        }
    }


    private void ExecuteTask()
    {
        try
        {
            CloudQueueMessage message = queue.GetMessage();
            if (message != null)
            {
                JMATask task = GetTask(message.AsString);
                queue.DeleteMessage(message);
                PerformTask(task);
            }
        }
        catch (Exception ex)
        {
            Trace.TraceInformation("Unable to get messages: " + ex.ToString());
        }
    }

从队列中获取消息或消息集将使队列的其他客户端在一段时间内看不到消息,并且只要您在该时间窗口内删除消息,其他客户端就不会看到它。因此,确保您在可视性超时内完成工作非常重要,否则您可能会让另一个工作人员拾取相同的逻辑消息并再次开始处理它

如果您知道工作人员处理特定类型的消息所需的平均时间,那么您可以调用TimeSpan来指定可见性超时的确切时间。无参数重载的默认值为30秒


此外,您还可以使用在工作角色内处理消息时动态更新可见性超时。通过这种方式,如果处理某件事情可能需要两个小时,但过程中有不同的步骤,则可以在执行这些步骤时更新可见性超时。这样,如果在工作人员角色中处理消息十分钟后失败,它将重新出现,并且可以更快地恢复。

并且您可以在时间实际用完之前随时更新不可见超时,同时更新消息本身。