如何利用mvc5在asp.net/C#中生成调度进程
我有一个MVC5应用程序,它具有在订阅时事通讯后向用户发送电子邮件的功能。现在,我有一个要求,即向所有在订阅到期日前1个月运行的用户发送电子邮件。在这种情况下,我需要实现一个在web服务器上每天特定时间运行的后台进程。我该怎么做如何利用mvc5在asp.net/C#中生成调度进程,c#,asp.net-mvc-5,C#,Asp.net Mvc 5,我有一个MVC5应用程序,它具有在订阅时事通讯后向用户发送电子邮件的功能。现在,我有一个要求,即向所有在订阅到期日前1个月运行的用户发送电子邮件。在这种情况下,我需要实现一个在web服务器上每天特定时间运行的后台进程。我该怎么做 谢谢这取决于您的要求,以及您是否希望此更新真正独立于服务器、在web应用程序中或与应用程序捆绑 我最近发现了一个很棒的ASP.NET第三方库,名为 看起来可以简单到: RecurringJob.AddOrUpdate( () => Console.Writ
谢谢这取决于您的要求,以及您是否希望此更新真正独立于服务器、在web应用程序中或与应用程序捆绑 我最近发现了一个很棒的ASP.NET第三方库,名为 看起来可以简单到:
RecurringJob.AddOrUpdate(
() => Console.WriteLine("Transparent!"),
Cron.Daily);
它支持:
- 延迟工作
- 重复性任务
- 自动重试
- 它有一个主题鲜明的管理/报告界面
有很多不同的方法来实现您想要的(服务器上的预定任务是我脑子里想不出来的另一个任务)。这是一个很好的小软件包,让我可以将它与我的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...
}