【问题标题】:HostedService starting on startupHostedService 在启动时启动
【发布时间】:2022-01-02 17:42:18
【问题描述】:

我正在开发一个 Web API,它应该处理一些长时间运行的任务,例如为数千次调用调用另一个外部 API 并存储返回的数据。我正在使用 DI 将服务注入我的控制器以处理逻辑。该服务是托管服务,因为这是我理解的最合适的服务类型。

我的问题是,每当启动 API 时都会调用 StartAsync() 方法——不仅是当我通过 API 控制器调用该方法时。有谁知道如何禁用调用该方法的框架?对于我的情况,是否需要甚至建议使用托管服务?

老实说,我只了解 Singleton、Transient 和 Scoped 服务之间的区别,并不太了解托管服务应该是什么。

【问题讨论】:

  • Singleton、Transient 和 Scoped 服务是对象的生命周期。另一方面, StartAsync 似乎是一个自定义函数。您可以分享代码以便我们了解您的问题吗? “每当启动 API 时都会调用 StartAsync() 方法” - 为什么不停止从启动类调用 StartAsync() 方法?
  • @Rahatur HostedServices 是一种类似于 Singleton、Scoped 和 Transient 的服务。 StartAsync 是来自 IHostedService 接口的方法。我实施的与这个问题无关,除了我注册服务而没有进一步配置的事实。
  • @Rahatur 我没有从 Startup 调用该方法。我自己只通过控制器调用方法,它是由框架调用的,没有我的启动
  • 明白你的意思。我已经发布了该问题的解决方案。

标签: .net asp.net-mvc dependency-injection


【解决方案1】:

IHostedService 的默认行为是在配置应用程序管道并且框架触发 ApplicationStarted 事件后立即开始执行。

可以更改默认行为,以便在配置应用的管道后运行 StartAsync 方法。为此,在调用 CreateBuilder 后添加托管服务:

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.
builder.Services.AddHostedService<YourServieName>();

如果您想进一步延迟服务,请按照here的回答。

请注意,ExecuteAsync 应尽快运行,因为 StopAsync 将等待它完成。基本上,您所做的是将 ExecuteAsync 的主体移动到另一种方法并延迟该方法。 因此,在该线程上讨论了一种解决方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2015-10-21
    • 2017-08-19
    • 2011-02-02
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多