private async Task <List <TimeSpan> > Execute()
        {
            List <TimeSpan> nextExecuteDelays = new List <TimeSpan>(); //记录每个任务的下次执行时间,取最小的等待

            if (_taskExecutor.GetTaskCount() > _options.Backlog)
            {
                _logger.LogWarning($"Aix.ScheduleTask定时任务积压太多超过{_options.Backlog}条定时任务待处理");
                await Task.Delay(TimeSpan.FromSeconds(5));

                return(nextExecuteDelays);
            }

            var now      = DateTimeUtils.GetTimeStamp();
            var taskList = await _aixScheduleTaskRepository.QueryAllEnabled(PreReadSecond * 1000 + now); //拉取即将到期的任务 提前{PreReadSecond}秒

            //逐个处理
            foreach (var task in taskList)
            {
                _scheduleTaskLifetime.ScheduleTaskStopping.ThrowIfCancellationRequested();

                var Schedule = CrontabHelper.ParseCron(_logger, task);
                if (task.LastExecuteTime == 0)
                {
                    task.LastExecuteTime = now;                            //任务第一次执行时,从当前时间开始
                }
                var nextExecuteTimeSpan = CrontabHelper.GetNextDueTime(Schedule, DateTimeUtils.TimeStampToDateTime(task.LastExecuteTime), DateTimeUtils.TimeStampToDateTime(now));

                if (nextExecuteTimeSpan <= TimeSpan.Zero)                               //时间到了,开始执行任务
                {
                    if (nextExecuteTimeSpan >= TimeSpan.FromSeconds(0 - PreReadSecond)) //排除过期太久的,(服务停了好久,再启动这些就不执行了)
                    {
                        await _scheduleTaskExecutor.Trigger(task, TimeSpan.Zero);       //
                    }

                    now = DateTimeUtils.GetTimeStamp();
                    task.LastExecuteTime = now;
                    //计算下一次执行时间
                    nextExecuteTimeSpan  = CrontabHelper.GetNextDueTime(Schedule, DateTimeUtils.TimeStampToDateTime(task.LastExecuteTime), DateTimeUtils.TimeStampToDateTime(now));
                    task.NextExecuteTime = now + (long)nextExecuteTimeSpan.TotalMilliseconds;
                    task.ModifyTime      = DateTime.Now;
                    await _aixScheduleTaskRepository.UpdateAsync(task);
                }

                if (task.NextExecuteTime == 0)  //只有第一次且未执行时更新下即可
                {
                    task.NextExecuteTime = now + (long)nextExecuteTimeSpan.TotalMilliseconds;
                    task.ModifyTime      = DateTime.Now;
                    await _aixScheduleTaskRepository.UpdateAsync(task);
                }

                nextExecuteDelays.Add(nextExecuteTimeSpan);
            }

            return(nextExecuteDelays);
        }
        public async Task Execute(BackgroundProcessContext context)
        {
            if (_taskExecutor.GetTaskCount() > _options.TaskExecutorMaxTaskCount) //队列任务积压超过1000就不要再拉取了,不然也处理不过来
            {
                await TaskEx.DelayNoException(TimeSpan.FromMilliseconds(_options.ConsumePullIntervalMillisecond), context.CancellationToken);

                return;
            }

            ////   >:读取未分配给其他消费者的消息(未被拉去的)  0-0或id: 读取pending 中的消息
            var list = await _database.StreamReadGroupAsync(_topic, _groupName, _consumerName, ">", BatchCount);

            if (list.Length == 0)
            {
                await TaskEx.DelayNoException(TimeSpan.FromMilliseconds(_options.ConsumePullIntervalMillisecond), context.CancellationToken);

                return;
            }

            await ProcessList(list, true);
        }