From 841afd2ebfbaed8f00d1cfd5457d8452252c69a6 Mon Sep 17 00:00:00 2001 From: dongfo <630024306@qq.com> Date: Tue, 12 May 2026 15:55:52 +0800 Subject: [PATCH] Fix delay handling in EnqueueAsync method Updated EnqueueAsync method to handle delay correctly by using BeginTime instead of interval. This prevents immediate execution of jobs with longer delay durations. --- .../BackgroundTasks/BackgroundJobManager.cs | 57 ++++++++++--------- 1 file changed, 30 insertions(+), 27 deletions(-) diff --git a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/BackgroundJobManager.cs b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/BackgroundJobManager.cs index edc460e4e..ded32941d 100644 --- a/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/BackgroundJobManager.cs +++ b/aspnet-core/modules/task-management/LINGYUN.Abp.BackgroundTasks/LINGYUN/Abp/BackgroundTasks/BackgroundJobManager.cs @@ -47,33 +47,36 @@ public class BackgroundJobManager : IBackgroundJobManager TimeSpan? delay = null) { var jobConfiguration = Options.GetJob(); - var interval = 0; - if (delay.HasValue) - { - interval = delay.Value.Seconds; - } - var jobId = GuidGenerator.Create(); - var jobArgs = new Dictionary - { - { nameof(TArgs), JsonSerializer.Serialize(args) }, - { "ArgsType", jobConfiguration.ArgsType.AssemblyQualifiedName }, - { "JobType", jobConfiguration.JobType.AssemblyQualifiedName }, - { "JobName", jobConfiguration.JobName }, - }; - var jobInfo = new JobInfo - { - Id = jobId.ToString(), - TenantId = CurrentTenant.Id, - Name = jobId.ToString(), - Group = "BackgroundJobs", - Priority = ConverForm(priority), - Source = JobSource.System, - BeginTime = DateTime.Now, - Args = jobArgs, - Description = "From the framework background jobs", - JobType = JobType.Once, - Interval = interval, - CreationTime = Clock.Now, + // 用 BeginTime 表达延迟启动,避免与 JobInfo.Interval(重复间隔)语义混用。 + // 原实现使用 delay.Value.Seconds(仅取秒分量 0-59), + // 会让 TimeSpan.FromMinutes(5) 这类整分钟/整小时的延迟退化为 0,导致任务立即执行。 + var now = Clock.Now; + var beginTime = now; + if (delay.HasValue && delay.Value > TimeSpan.Zero) + { + beginTime = now.Add(delay.Value); + } + var jobId = GuidGenerator.Create(); + var jobArgs = new Dictionary + { + { nameof(TArgs), JsonSerializer.Serialize(args) }, + { "ArgsType", jobConfiguration.ArgsType.AssemblyQualifiedName }, + { "JobType", jobConfiguration.JobType.AssemblyQualifiedName }, + { "JobName", jobConfiguration.JobName }, + }; + var jobInfo = new JobInfo + { + Id = jobId.ToString(), + TenantId = CurrentTenant.Id, + Name = jobId.ToString(), + Group = "BackgroundJobs", + Priority = ConverForm(priority), + Source = JobSource.System, + BeginTime = beginTime, + Args = jobArgs, + Description = "From the framework background jobs", + JobType = JobType.Once, + CreationTime = now, // 确保不会被轮询入队 Status = JobStatus.None, NodeName = TasksOptions.NodeName,