【问题标题】:How to schedule a method in .net core?如何在.net core中安排一个方法?
【发布时间】:2018-08-12 16:58:00
【问题描述】:

我必须从该 Helper 方法调用 Web API,它将所需的数据转储到数据库。

我想创建一个每次都会自动调用的方法 小时。

是否需要从 Startup CS 文件中调用它,如果是,那么如何调用?

预期的方法将假设调用 API 来获取数据 将以每小时的方式转储到 SQL 数据库中。

【问题讨论】:

  • ASP.NET Core(以及所有在 Web 服务器上运行的东西,真的)不适合长时间运行的任务或计划。查看更简单的 Windows 服务和/或任务计划程序
  • 如果你想每小时更新一些数据,让数据库来做。如果您告诉我们您的数据库以及您想要更新的内容,我们可能会提供更好的帮助。
  • Hangfire 是一个很棒的任务调度框架hangfire.io
  • @DourHighArch 更新问题

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


【解决方案1】:

为此,我强烈推荐 Hangfire。 https://www.hangfire.io/

【讨论】:

  • @jmdn 如何使用hangfire调用循环方法,
  • @Soader03 是的,我已经检查过了,但无法使用 hangfire 调用集体诉讼:RecurringJob.AddOrUpdate(() => new ScopedCountryProcessingService().DoWork(this.LookupSearch), Cron.Minutely() ); --- DoWork 方法没有被调用
  • 如果您已经完成了本教程并且无法使其正常工作,那么我建议您打开一个新问题,发布与 Hangfire 相关的相关代码。然后可以更容易地诊断问题。您需要完成安装和配置步骤docs.hangfire.io/en/latest/installation.html
【解决方案2】:

这取决于您的操作方式以及您使用的操作系统。
如果您使用 Linux,则可以使用 OS 调度程序 - cron。或 AnaCron。
如果您是 Windows,则可以使用 Windows 任务调度程序。
Cron 可能也可以在 MacOS 上运行,尽管我想他们有自己的任务调度程序。
如果您在 Azure/AWS/DigitalOcean/AppEngine 上使用您的应用程序,那么他们可能都有执行此操作的工具。

.NET 中有一个库可以进行作业调度,它被称为Quartz
我不知道他们是否已经移植到 .NET Core,但我想他们已经移植了。

另外,如果您在 ASP.NET (Core) 应用程序中使用您的应用程序,我不知道 IIS 在 20 分钟不活动后回收应用程序池的情况如何。如果是这样,那么您无法在 ASP.NET 中执行此操作,或者您需要更改应用程序或 IIS 的配置。
注意:根据this,当 IIS 回收应用程序池时,ASP.NET Core 应用程序肯定会停止,即使 IIS 只需要回收反向代理。

我们过去采用的一种方法是在应用程序中使用 ashx 处理程序,该处理程序执行一次(使用 JWT 标头身份验证,因此不可能出现 DOS/DDOS)。

然后我们只是在某个地方运行了一个程序,它每小时向 ashx 处理程序发出一个 get 请求。这可确保任务每小时运行一次,并让 IIS 回收应用程序池。因为这意味着 IIS 可能需要启动整个应用程序,所以您应该相应地增加获取请求的超时时间。该系统很简单,它在任何地方都可以正常工作,开发机器、内部部署、自托管、共享托管、azure、aws、appengine、digitalocean 等,甚至不需要任何库。

最重要的是,以最简单的形式,你可以只使用 wget 和 cron,这非常简单,你可以用它做一些相当复杂的事情,例如在一个月的最后一天运行一个程序 (28,29 ,30,31)在 01:05,或者像每个月的第一个星期五,或者每个星期一至星期六的 4 点到 23 点,从 04:23 开始每 13 分钟,或者任何你想要的。

作业调度完全需要零 .NET 编程。

【讨论】:

    【解决方案3】:

    您可以在应用程序中设置一个调用该方法的 Web Hook,并在 Azure 中创建一个逻辑应用程序,该应用程序每小时触发一次以调用该 Web 挂钩。

    【讨论】:

      【解决方案4】:

      这取决于几件事,特别是您的应用程序的托管位置(azure、aws、on prem、本地)以及您希望如何将调度程序耦合到 web api 服务。 例如,假设您托管在 azure 中。您可以使用 azure 中每小时安排的计时器来触发和调用您的端点。 AWS 具有类似的功能,您可以调用 lambda 函数。 如果你在本地,你可以创建一个服务,比如 hangfire 来进行调度。 如果您真的希望手动运行计划,您甚至可以创建一个带有 Timer 和 TimerCallback 的 WCF 服务,该服务每小时调用一次。

      【讨论】:

      • 应用程序托管在 AZURE 上,它从第三方 Web API 获取数据,因此要从预定方法调用 Web API,必须首先解决所有必需的依赖项
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-05
      • 1970-01-01
      • 2016-11-15
      • 1970-01-01
      • 2020-12-27
      相关资源
      最近更新 更多