如何使用mvc5在asp.net/C#中进行预定的过程

时间:2015-04-30 09:28:59

标签: c# asp.net-mvc-5

我有一个MVC5应用程序,它具有在订阅简报后向用户发送电子邮件的功能。现在我需要向所有那些在订阅到期日前提前一个月运行的用户发送电子邮件。在这种情况下,我需要实现一个后台进程,该进程将在Web服务器上的特定时间每天运行。我怎么能这样做?

由于

4 个答案:

答案 0 :(得分:1)

就个人而言,我创建了一个单独的专用Windows服务来定期检查到期日期,然后调用代码发送电子邮件。

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

安全性较低的方法是使用ping服务,定期点击带有处理电子邮件的模糊URL的页面。

一篇稍微陈旧但相关的博文,详细介绍了.net网站can be read here中经常出现的后台任务的问题。

答案 1 :(得分:1)

您可以创建Windows服务以使其正常工作。 你应该遵循这个tutorial。 您可以将日期/时间存储在项目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();
    }
}

YourServiceClass 类中添加此功能:

public void GetData(object state){
    // Do something...
}

希望它有所帮助!

答案 2 :(得分:0)

这实际上取决于您的要求,以及您是否希望此更新在服务器,Web应用程序或与您的应用程序捆绑在一起时真正独立。

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

它看起来很简单:

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

它支持:

  • 延迟工作
  • 重复任务
  • 自动重试
  • 它有一个很好的主题管理/报告界面

我打算将它用于我需要在CRM系统上运行的一些预定批处理任务。没有经验,但它确实有一些很棒的功能,我想我已经看过它推荐了几次围绕Stack Overflow!

有很多不同的方法来接近你想要的东西(服务器上的预定任务是另一个我的头脑)。这是一个很好的小包,可以让我将它与我的Web应用程序捆绑在一起。

答案 3 :(得分:0)

我建议您使用Quartz库。您的流程应独立于您的Web应用程序,因为Web应用程序将根据将触发Application_End事件的用户流量不时回收,并将在发送新请求后启动,这将触发Application_Start,因此您将无法正确管理你的日程安排开始和结束。