Hangfire:延迟调用方法不起作用

Hangfire: Calling methods with delay doesn't work

我有一个 ASP.NET 核心应用程序,想使用 Hangfire 执行一些后台任务。 我按照官方文档中的描述设置了Hangfire,我可以调用通常的后台任务。 但是,我在延迟调用方法时遇到问题。

public void Configure(/*other params*/ IBackgroundJobClient backgroundJobsClient)
{
   //Other code
   
   backgroundJobsClient.Enqueue(() => Console.WriteLine("Method"));
   backgroundJobsClient.Schedule(() => Console.WriteLine("Delayed Method"), TimeSpan.FromSeconds(2));
}

我在控制台中只有“方法”输出。

等了一分钟后,我的控制台出现异常:

Hangfire.Processing.BackgroundExecution[0] Execution DelayedJobScheduler is in the Failed state now due to an exception, execution will be retried no more than in 00:00:04 Hangfire.PostgreSql.PostgreSqlDistributedLockException: Could not place a lock on the resource 'HangFire:locks:schedulepoller': Lock timeout. at Hangfire.PostgreSql.PostgreSqlDistributedLock.PostgreSqlDistributedLock_Init_Transaction(String resource, TimeSpan timeout, IDbConnection connection, PostgreSqlStorageOptions options) at Hangfire.PostgreSql.PostgreSqlDistributedLock..ctor(String resource, TimeSpan timeout, IDbConnection connection, PostgreSqlStorageOptions options) at Hangfire.PostgreSql.PostgreSqlConnection.AcquireDistributedLock(String resource, TimeSpan timeout) at Hangfire.Server.DelayedJobScheduler.UseConnectionDistributedLock[T](JobStorage storage, Func2 action) at Hangfire.Server.DelayedJobScheduler.EnqueueNextScheduledJobs(BackgroundProcessContext context) at Hangfire.Server.DelayedJobScheduler.Execute(BackgroundProcessContext context) at Hangfire.Server.BackgroundProcessDispatcherBuilder.ExecuteProcess(Guid executionId, Object state) at Hangfire.Processing.BackgroundExecution.Run(Action2 callback, Object state) !!! Could not place a lock on the resource 'HangFire:locks:schedulepoller': Lock timeout.

所以,我想延迟方法初始化存在一些问题。 有人可以帮我吗?可能我没有为 ASP.NET 核心正确设置 Hangfire。

我终于找到了解决办法。 日期以 UTC 格式存储在 Hangfire 数据库中。 我不知道,官方 documentation 也没有说什么。 正确的代码应该是这样的:

DateTime.UtcNow.AddSeconds(2);

我解决了这个问题,如下所示。

locktableHangfiretables.我删除了锁 table 中的所有数据,我的问题解决了。