我正在使用.net core开发一个web应用程序项目,如果问题对象已经发布了3天没有答案,我想从数据库(在我的例子中是MySQL(中自行关闭(删除(它。我相信我可以使用Worker Services,但我不确定如何使用它,也不确定在后台运行这么多后台服务是否合乎逻辑(每个问题一个服务/计时器(。非常感谢。
只需过滤掉它们,不要在对UI的查询中返回它们。当你想手动删除时,或者有一个每天运行一次的后台作业,或者随时删除
此作业只需要一个后台服务。
我假设你已经有了一个服务接口:
public interface IQuestionService {
Task<IEnumerable<Question>> GetQuestionsToClose();
Task CloseQuestions(IEnumerable<Question> questions);
}
比你需要实现你的后台服务:
public CloseQuestionsBackgroundService : BackgroundService
{
private readonly IQuestionService questionService;
public CloseQuestionsBackgroundService(IQuestionService questionService)
{
this.questionService = questionService;
}
protected override async Task ExecuteAsync(CancellationToken stopToken)
{
while (!stopToken.IsCancellationRequested)
{
var questionsToClose = questionService.GetQuestionsToClose().ConfigureAwait(false);
if (questionsToClose.Any())
{
await questionService.CloseQuestions(questionsToClose).ConfigureAwait(false);
}
await Task.Delay(Timespan.FromSeconds(10)).ConfigureAwait(false); // choose how much time between iterations
}
}
}
现在您只需要在Startup.cs 的ConfigureService方法中注册后台服务
services.AddHostedService<CloseQuestionsBackgroundService>();
我建议在sql中为此创建代理作业,并在Questions表和answer表之间建立关系,您的查询如下
Delete from QuestionsTable
where id not in (select FK_questionID from AnswersTable)
AND CreateDate < DATE_ADD(NOW() , INTERVAL -3 DAY)
并每天执行此查询
您还可以更新问题表中的活动字段
我希望它能帮助你