【发布时间】:2018-08-05 12:13:39
【问题描述】:
基本上我要做的是创建一个在给定天数内执行的线程,它可以改变。关键是应该定期发送一封电子邮件,我正在寻找最好的方法,尽管我知道这绝对不是最好的解决方案之一,但我必须根据要求继续这样做,因此我不能使用 Windows 服务、Windows 调度程序或任何类似的东西。因此,发送此电子邮件的开始日期是应用程序启动时,然后下一次应该是在 web.config 中指定的 X 天之后。问题是如果应用程序停止(我可以将应用程序启动的日期保存在数据库中),我不知道如何跟踪它,但下一次执行的天数可能会改变。这是我到目前为止所做的:
private async Task<int> EmailScheduler()
{
var day = DateTime.Now.Day; //day when app starts
while (true)
{
var currentTime = DateTime.Now;
if (currentTime.Day == day)
{
SendEmail("mailto", "", "", "subject", EmailMessage());
day += Int32.Parse(ConfigurationManager.AppSettings["NumberOfDays"]); //next schedule
}
await Task.Delay((int)TimeSpan.FromDays(1).TotalMilliseconds);
}
}
提前致谢。
【问题讨论】:
-
这是对 asp.net 的严重误用,但如果在不了解他们要求的情况下创建需求的任何人都可以接受,那么您可以使用 Hangfire 之类的任务调度程序使其大部分时间都能正常工作。
-
您能告诉我们为什么不允许您使用 Windows 服务/调度程序吗?
-
另一种选择是使用第三方cron服务定期调用一个页面,并在该页面中有逻辑
-
IIS 具有执行实际代码的工作进程。这些工作进程会定期被设计杀死,通常是在您的进程内存占用超过某个阈值时。当然,在一段时间内,期望工作进程不循环是不现实的。您是否愿意使用可以由 ASP.Net 应用程序控制其行为的 Windows 服务?例如,您的 Asp.net 应用程序中的操作需要安排这样的电子邮件,因此将详细信息传递给 Windows 服务,该服务会在适当的时间编组电子邮件。
标签: c# asp.net multithreading