C# Can';在锁定期限到期后,我是否要续订锁定?使用Azure服务总线主题

C# Can';在锁定期限到期后,我是否要续订锁定?使用Azure服务总线主题,c#,azure,azureservicebus,azure-servicebus-queues,C#,Azure,Azureservicebus,Azure Servicebus Queues,使用Azure服务总线主题 例如,5分钟后,如果一个用户尝试更新一个锁,它会显示锁已过期的消息 还有什么其他的选择来解决这个问题 我有超过5分钟的事务,在这之后我想将代理消息状态设置为完成 有任何选项吗?您可以使用此处介绍的RenewLock()方法: 您还可以阅读这篇关于如何使用Service Bus实现可靠消息传递循环的文章:要添加到Sam的答案中,如果锁的持续时间已过,则无法续订该消息的锁。锁过期后,可以将消息分发给其他消费者。这意味着,如果您被允许在锁过期后调用“续订锁”,则其他人可能正

使用Azure服务总线主题

例如,5分钟后,如果一个用户尝试更新一个锁,它会显示锁已过期的消息

还有什么其他的选择来解决这个问题

我有超过5分钟的事务,在这之后我想将代理消息状态设置为完成

有任何选项吗?

您可以使用此处介绍的RenewLock()方法:


您还可以阅读这篇关于如何使用Service Bus实现可靠消息传递循环的文章:

要添加到Sam的答案中,如果锁的持续时间已过,则无法续订该消息的锁。锁过期后,可以将消息分发给其他消费者。这意味着,如果您被允许在锁过期后调用“续订锁”,则其他人可能正在处理该消息,并且就服务总线而言,该消息已被其他用户锁定。有人可能会说,如果RenewLock检查邮件是否已经再次分发,如果没有,则进行续订,这将是一种“很好的选择”,但它不会这样做。如果您有足够多的消费者,并且消息被粗略地按顺序处理,那么消息很可能已经在其他地方关闭了

如果一个工作单元需要5分钟以上的时间,则需要在处理过程中或在单独的线程上管理续订。例如,如果您的处理是在您做一些工作并让控制流经常返回到您的代码中,那么处理线程可以关注时间量,并根据需要进行更新;但是,处理线程很可能很忙,在这种情况下,您希望有一个单独的线程来处理续订


您可以查看您的系统正在执行什么处理,并查看是否可以将其分解为更小的工作块并分布在一系列队列中

“有人可能会说,如果RenewLock检查邮件是否已再次分发,如果没有,则进行续订,这将是一种“很好的选择”,但它不会这样做。“我同意这一点……这将非常好:-)是的,我正在检查另一个线程上的锁定状态。”。。我能满足我的需要。一个问题是,当我在不同的线程上更新锁时,可能会出现更新锁和将消息状态设置为“已完成”同时执行的情况,然后有时更新锁会抛出错误(因为它已完成)。所以我想知道如何克服这一点。目前我使用了c#的“lock”对象,协调线程从来都不容易。在我看来,使用锁是正确的方法。谢谢Sam,我在主题服务总线上也使用同样的方法。
QueueClient queueClient = QueueClient.CreateFromConnectionString(serviceBusConnectionString, queueName);
BrokeredMessage receivedMessage = await queueClient.ReceiveAsync();
await receivedMessage.RenewLockAsync();