【问题标题】:Asp.Net - Scheduled Task using IHostedServiceAsp.Net - 使用 IHostedService 的计划任务
【发布时间】:2020-06-03 20:16:19
【问题描述】:

我正在开发一个用 C# 编写并托管在使用 IIS 10 作为 Web 服务器的 Azure 虚拟机中的 ASP.NET Web 应用程序。我必须安排一个后台任务每天运行一次。为此,我创建了以下DailyTask 类:

public class DailyTask : IHostedService {

    public Task StartAsync(CancellationToken cancellationToken) {
        Debug.WriteLine("start");
        Task.Run(TaskRoutine, cancellationToken);
        return Task.CompletedTask;
    }

    public Task StopAsync(CancellationToken cancellationToken) {
        Debug.WriteLine("stop");
        return null;
    }

    public Task TaskRoutine() {
        while (true) {
            try {
                /* ... */

                DateTime nextStop = DateTime.Now.AddDays(1);
                var timeToWait = nextStop - DateTime.Now;
                var millisToWait = timeToWait.TotalMilliseconds;
                Thread.Sleep((int)millisToWait);
            }

            catch (Exception e) {
                Debug.WriteLine(e);
            }
        }
    }
}

为了开始这项任务,我在 Startup 类中添加了以下语句:

public class Startup {
    public void ConfigureServices(IServiceCollection services) {
        /* ... */
        services.AddSingleton<Microsoft.Extensions.Hosting.IHostedService, HiddenUserCleaner>();
        /* ... */
    }
}

在我的测试服务器上部署后,我观察到此解决方案运行良好。但它可靠吗?如果在生产中使用会不会有问题?

【问题讨论】:

标签: c# asp.net iis scheduled-tasks


【解决方案1】:

这不安全。看看这里的指南:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-3.1&tabs=visual-studio

如果应用意外关闭(例如,应用进程失败),则可能不会调用 StopAsync。因此,在 StopAsync 中调用的任何方法或执行的操作都可能不会发生。

情况并非完全如此,但它假定应用程序可以重新启动。偶尔重启的应用程序池也是如此。

总的来说,这并不能保证它会每天运行。如果应用程序由于某种原因频繁重新启动,则可能是它永远不会运行。

hangfire 之类的库也是如此。

其他解决方案可能是网络作业,或者您可以使用某种持久性(例如存储上次执行时间的数据库)检查它今天是否已执行,IHostingService 将每隔一段时间检查一次并在启动时检查是否它应该执行后台作业并采取相应的行动。

【讨论】:

  • 好吧,我不完全同意。看,任务在程序(网站)运行后立即运行。这意味着即使网站崩溃,当应用程序重新启动时任务将再次运行(这通常会自动发生)。尽管从程序员的角度来看,这种方法不是最好的或最干净的,但它仍然是快速而笨拙的“必须立即工作”解决方案的一个很好的解决方案。
猜你喜欢
  • 2011-01-22
  • 2011-02-25
  • 1970-01-01
  • 2020-12-02
  • 1970-01-01
  • 2013-09-26
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
相关资源
最近更新 更多