C# 为什么BrokeredMessage.RenewLock()只更新锁几秒钟?

C# 为什么BrokeredMessage.RenewLock()只更新锁几秒钟?,c#,azure,servicebus,brokeredmessage,C#,Azure,Servicebus,Brokeredmessage,我有一个BrokeredMessageContext类,它使用计时器定期检查并更新BrokeredMessage实例上的锁,以防处理此消息的进程运行的时间超出预期。它通过调用BrokeredMessage实例上的RenewLock()方法来更新锁 我希望这个调用会给我一个与原始锁()具有相同超时的新锁,但在调试时,锁超时似乎增加了“任意”10-15秒。我在BrokeredMessage实例上设置了一个监视,我可以看到每次调用RenewLock()时LockedUntilUtc属性都会增加10-1

我有一个BrokeredMessageContext类,它使用计时器定期检查并更新BrokeredMessage实例上的锁,以防处理此消息的进程运行的时间超出预期。它通过调用BrokeredMessage实例上的RenewLock()方法来更新锁

我希望这个调用会给我一个与原始锁()具有相同超时的新锁,但在调试时,锁超时似乎增加了“任意”10-15秒。我在BrokeredMessage实例上设置了一个监视,我可以看到每次调用RenewLock()时LockedUntilUtc属性都会增加10-15秒

有人知道为什么会这样吗?有什么办法可以延长锁的使用时间吗

编辑:


下面迈克的回答是正确的。我发现,事实上,我从一开始就尝试每10秒更新一次锁,即使我的代码打算在锁过期前20秒之前更新锁。这一切都归结为一个时间比较的问题,以及我的机器上的时间是错误的(它领先了将近一分钟)。哦

调用RenewLock时,它会重置消息被队列或订阅上设置的锁定持续时间锁定的时间。如果执行更新的类有一个计时器,该计时器每10-15秒触发一次,那么您看到的行为是正确的

例如: 我有一个锁定持续时间为1分钟(默认值)的队列。
我在UTC凌晨1:20拉取消息,因此锁定的LUTC应为UTC凌晨1:21。 如果在处理10秒后,我调用Renew lock,则调用将在凌晨1:20:10触发,因此LockedUntilUtc将变为凌晨1:21.10

它将锁定持续时间值添加到服务器的当前时间,而不是之前的LockedUntilUtc值。这会延长消息的锁定时间


此答案假设您经常在计时器上触发触发器,而不是等待接近实际锁定超时。如果你想更精确一些,你可以在锁过期前10-20秒设置定时器,然后进行更新锁

你好,迈克,谢谢你的回答。这并不反映我所看到的。我的锁持续时间为1分钟,40秒后我尝试更新锁。不过,锁的持续时间只增加了10秒左右,这确实很奇怪。我很快尝试了这一点,并且使用默认的1分钟以及其他各种时间对LockedUntilUtc进行了更新。因此,基于你在某一点上的问题,我认为锁会用完,因为你的计时器最终会在“添加”时间后启动。你看到了吗?此外,如果您提供一些代码和/或计时示例,可能会有所帮助?我将更新我的问题,并将您的答案标记为已接受。。。在我的代码中添加了大量日志之后,我发现我看到的行为是由于时间比较问题造成的。您的答案绝对正确。请注意服务器和客户端计算机之间的任何直接时间比较。时钟漂移在任何托管环境中都会发生。注意。我重新编写了锁处理程序,因此它只关心锁的持续时间,而不依赖于服务器UTC时间和LockedUntilUtc的比较。谢谢你,迈克。