【问题标题】:Thread that executes every X number of days on c# - ASP.NET在 c# 上每 X 天执行一次的线程 - ASP.NET
【发布时间】: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


【解决方案1】:

您无法控制应用程序池何时重新启动,而且它肯定不会长时间运行。

您可以将上次执行日期保存在数据库中,并定期轮询它以查看它是否比您给定的天数长。

轮询频率取决于您的要求。

这有点接近“每隔几天”发送一封邮件,但它可能不如预定任务准确。

【讨论】:

    猜你喜欢
    • 2013-01-28
    • 1970-01-01
    • 2021-10-03
    • 2016-01-26
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-14
    相关资源
    最近更新 更多