数据库本身不会为您提供任何计时器或计划任务(至少 SQLLite 不会)。您必须编写一个清理过期列表的任务,为此,您有几个选项:
- 使用在您自己的 ASP.net 应用程序中安排的任务
- 使用由您的托管服务提供商安排和管理的任务(单独的应用程序)。如果您在云上,您的云提供商很可能有能力为您执行此操作。
如果您想使用第一个选项,请查看Quartz。我在 Azure 上有一个 WorkerRole,而不是使用 Quartz 来做你需要的事情。设置起来相当简单,这里有一个例子:
// Initialize Quartz
ISchedulerFactory schedulerFactory = new StdSchedulerFactory();
_scheduler = schedulerFactory.GetScheduler();
_scheduler.JobFactory = new NinjectJobFactory(_kernel);
DateTimeOffset morning = DateBuilder.NewDateInTimeZone(TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"))
.AtHourMinuteAndSecond(5, 30, 0)
.Build();
// Schedule task for email being sent to people who have not signed up after their trial expiry
IJobDetail userFeedbackJobDetail = JobBuilder.Create<LostUserFeedbackRequestJob>().WithIdentity("User Feedback Emails").Build();
ITrigger dailyTriggerForUserFeedback = TriggerBuilder.Create()
.WithIdentity("Daily Trigger (User Feedback)")
.StartAt(morning)
.WithSimpleSchedule(schedule => schedule.WithInterval(TimeSpan.FromDays(1)).RepeatForever())
.ForJob(userFeedbackJobDetail)
.Build();
_scheduler.ScheduleJob(userFeedbackJobDetail, dailyTriggerForUserFeedback);
// Finally, start the scheduler
_scheduler.Start();
这每天都会发送一封电子邮件,询问在试用期结束后没有选择使用我的一个项目的服务的用户的反馈。该作业每天早上 5:30 运行