如何利用mvc5在asp.net/C#中生成调度进程

如何利用mvc5在asp.net/C#中生成调度进程,c#,asp.net-mvc-5,C#,Asp.net Mvc 5,我有一个MVC5应用程序,它具有在订阅时事通讯后向用户发送电子邮件的功能。现在,我有一个要求,即向所有在订阅到期日前1个月运行的用户发送电子邮件。在这种情况下,我需要实现一个在web服务器上每天特定时间运行的后台进程。我该怎么做 谢谢这取决于您的要求,以及您是否希望此更新真正独立于服务器、在web应用程序中或与应用程序捆绑 我最近发现了一个很棒的ASP.NET第三方库,名为 看起来可以简单到: RecurringJob.AddOrUpdate( () => Console.Writ

我有一个MVC5应用程序,它具有在订阅时事通讯后向用户发送电子邮件的功能。现在,我有一个要求,即向所有在订阅到期日前1个月运行的用户发送电子邮件。在这种情况下,我需要实现一个在web服务器上每天特定时间运行的后台进程。我该怎么做


谢谢

这取决于您的要求,以及您是否希望此更新真正独立于服务器、在web应用程序中或与应用程序捆绑

我最近发现了一个很棒的ASP.NET第三方库,名为

看起来可以简单到:

RecurringJob.AddOrUpdate(
    () => Console.WriteLine("Transparent!"), 
    Cron.Daily);
它支持:

  • 延迟工作
  • 重复性任务
  • 自动重试
  • 它有一个主题鲜明的管理/报告界面
我计划将它用于一些需要在CRM系统上运行的计划批处理任务。目前还没有使用它的经验,但它似乎有一些很棒的特性,我想我已经看过几次关于堆栈溢出的推荐


有很多不同的方法来实现您想要的(服务器上的预定任务是我脑子里想不出来的另一个任务)。这是一个很好的小软件包,让我可以将它与我的web应用程序捆绑在一起。

我个人会创建一个单独的专用Windows服务,定期检查过期情况,然后调用代码发送电子邮件

另一种方法是创建一个简单的控制台应用程序来运行任务,并使用Windows任务调度器调用它

一种不太安全的方法是使用ping服务,周期性地点击带有处理电子邮件的模糊URL的页面


一篇稍旧但相关的博客文章,详细介绍了.net站点中经常性的后台任务的问题。

您可以创建一个Windows服务来让它为您服务。 你应该遵循这个。 您可以将日期/时间存储在项目
web.config/app.config
上,以便执行服务。当服务执行时,您验证时间并调用一个通用函数,该函数将执行您想要的操作。请遵循以下示例:

public partial class Service1 : ServiceBase
{
    YourServiceClass service;
    private Timer serviceTimer;

    public Service1()
    {
        InitializeComponent();
        service = new YourServiceClass();
    }

    protected override void OnStart(string[] args)
    {
        TimerCallback timerDelegate = new TimerCallback(service.GetData); // You should add this function to your class. You have an example below

        string time = System.Configuration.ConfigurationSettings.AppSettings["SceduleTime"];    // Gets time from app.config like 12:50
        string[] timeS = time.Split(':');

        DateTime DateIni = new DateTime(DateTime.Now.Year, DateTime.Now.Month, DateTime.Now.Day, Convert.ToInt32(timeS[0]), Convert.ToInt32(timeS[1]), 0);

        TimeSpan diff = DateTime.Now - DateIni;
        if (diff.TotalSeconds < 0)
            diff = DateIni - DateTime.Now;
        else
            diff = DateIni.AddDays(1) - DateTime.Now;

        // create timer and attach our method delegate to it
        serviceTimer = new Timer(timerDelegate, service, diff, new TimeSpan(1, 0, 0, 0));
    }

    protected override void OnStop()
    {
        serviceTimer.Dispose();
    }
}

希望有帮助

我建议您使用图书馆。您的流程应该独立于您的web应用程序,因为web应用程序将根据用户流量不时循环,这将触发应用程序结束事件,并在发送新请求后启动,这将触发应用程序启动,因此您将无法正确管理您的计划开始和结束。

有几个选项方式。最简单的方法可能是制作一个控制台应用程序来执行此操作,然后制作一个每天运行一次的计划任务。简单地说:您不需要编写另一个应用程序,您可以使用windows任务来计划,除了Cris W-Scott Hanselman提供的答案之外
public void GetData(object state){
    // Do something...
}