我的Web应用程序需要在特定时间发送电子邮件,我已经完成了其他部分,例如从SQL Server获取数据并通过电子邮件发送数据,但下一步是自动将其自动化为每天在特定时间发送电子邮件(例如太平洋标准时间凌晨5点(。在 ASP.NET Core Web 应用程序中,是否可以每天自动调用操作方法,而无需我们手动单击按钮或触发事件?
感谢您分享您的知识。
你可以像这样使用IHostedService:
public class TimedHostedService : IHostedService, IDisposable
{
private Timer _timer;
public TimedHostedService()
{
//Some DI here...
}
public Task StartAsync(CancellationToken stoppingToken)
{
//this will trigger DoWork every minute
_timer = new Timer(DoWork, null, TimeSpan.Zero,
TimeSpan.FromMinutes(1));
return Task.CompletedTask;
}
private void DoWork(object state)
{
//Every time when DoWork is triggered you can check time that you need
var start = new TimeSpan(15, 0, 0);
var end = new TimeSpan(15, 0, 59);
var now = DateTime.Now.TimeOfDay;
if(start <= now && end <= now)
{
//send emails
}
}
public Task StopAsync(CancellationToken stoppingToken)
{
_timer?.Change(Timeout.Infinite, 0);
return Task.CompletedTask;
}
public void Dispose()
{
_timer?.Dispose();
}
}
您可以在此处找到有关它的更多信息:https://learn.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.1&tabs=visual-studio
密切注意这一点:
计时器不会等待先前的 DoWork 执行完成,因此显示的方法可能并不适合每种方案。
您只需要发送一次电子邮件,因此在DoWork中相应地调整计时器间隔和时间检查非常重要,这样您就不会发送电子邮件两次。