【问题标题】:Run a background task with asp.net mvc core使用 asp.net mvc core 运行后台任务
【发布时间】:2019-06-05 04:16:10
【问题描述】:

我正在开发一个 asp.net mvc core 2 应用程序。

我想在我的应用程序的后台运行一种 cron 任务,该任务每 10 分钟启动一次。 我已经编写了一个控制台应用程序来执行此操作,但我想知道是否有办法将此代码直接放入 asp.net mvc 核心项目(Startup.cs ?)

【问题讨论】:

    标签: asp.net asp.net-core asp.net-core-mvc background-task


    【解决方案1】:

    控制台应用程序应该是一样的。 asp.net 核心应用程序中有一个main 函数。也可以放在 StartUp.cs 中。

    唯一的问题是,例如,如果您在 IIS 中托管您的应用程序。通常在有时没有传入请求之后,您的应用程序将进入睡眠模式(被杀死),您的后台任务也是如此。所以你需要仔细验证。

    【讨论】:

    • 谢谢,但是如何仔细检查呢?
    【解决方案2】:

    【讨论】:

      【解决方案3】:

      向您的 Startup.cs 添加内容是一种可行的方法。

      你可以这样实现你的工作:

      public class YourCronService: IHostedService
      {
      
          public Task StartAsync(CancellationToken cancellationToken)
          {
              Task.Run(TaskRoutine, cancellationToken);
              return Task.CompletedTask;
          }
      
          public Task StopAsync(CancellationToken cancellationToken)
          {
              Console.WriteLine("Sync Task stopped");
              return null;
          }
      
          public Task TaskRoutine()
          {
              while (true)
              {
                  //Do what ever you want to do all 10 Minutes
      
                  //Wait 10 minutes till next execution
                  DateTime nextStop = DateTime.Now.AddMinutes(10);
                  var timeToWait = nextStop - DateTime.Now;
                  var millisToWait = timeToWait.TotalMilliseconds;
                  Thread.Sleep((int)millisToWait);
              }
          }
      }
      

      实现您的服务后,您只需将以下代码行添加到您的 Startup.csConfigureServices 方法中:

      services.AddSingleton<IHostedService, YourCronService>();
      

      如果您这样做,您应该明确检查您的服务器是否“始终开启”。如果您的服务器处于待机模式,则不会执行该作业。 Auzure Web App 就是一个很好的例子。如果您的网络应用有一段时间未使用,它将设置为待机模式,直到下一次请求,除非您打开“始终开启”功能。

      【讨论】:

      • 谢谢,有没有办法在iis中设置always-on选项?
      • @Bob5421 我不确定网站本身是否存在。如果我是对的,您必须为该站点运行的整个应用程序池打开该功能。您可以在高级设置下找到它。更改后重新启动您的网络服务器以确保更改处于活动状态
      【解决方案4】:

      我已经能够在 MVC Core 中使用 HangFire 做到这一点。

      Hangfire

      我添加了 Nuget 包: Hangfire.AspNetCode、HangFire.Console 和 HangFire.SqlServer

      配置服务:

      services.AddHangfire(x => x.UseSqlServerStorage(connectionForHangFire));
      

      配置:

      app.UseHangfireDashboard();
      app.UseHangfireServer();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-12-14
        • 1970-01-01
        • 2016-09-29
        • 2021-01-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多