.net 在应用程序的整个生命周期中没有运行IHostedService的长时间运行任务?

xytpbqjk  于 2023-01-22  发布在  .NET
关注(0)|答案(1)|浏览(167)

我有一个网站页面,需要选择执行可能需要几分钟的操作。为了避免性能问题和超时,我希望在HTTP请求之外运行此操作。
经过一番研究,我找到了IHostedServiceBackgroundService,它们可以使用AddHostedService<T>()注册为单例。
但我担心的是托管服务总是在运行,当我只想让它按需运行时,这看起来不像是浪费资源吗?
有谁知道运行冗长任务的更好选择,或者不需要无休止运行的IHostedService的使用方法吗?

  • 请注意,操作调用并等待API调用。因此,我无法报告操作的进度,也无法在公共数据库中设置有关操作是否已完成的标志。*
eh57zj3b

eh57zj3b1#

一个选项是使用**message queue。当请求操作时,您可以让Razor Pages网站向队列发送消息,并使用一个单独的服务(如后台工作进程**)从队列中使用消息并执行操作。这允许您将任务与Web请求分离。并且还允许添加更多工作者示例来处理工作负载的可能性。
另一种选择是使用按需运行的**task scheduler,如Hangfire。它允许您调度后台作业并监视其进度,这在您无法报告操作进度的情况下非常有用。
您也可以使用
IHostedService,但您需要确保**服务仅在需要时运行。您可以使用flagsemaphore来控制服务是否运行。您可以在请求操作时设置标志或信号量。并在操作完成时将其清除。然后,服务可以在其主循环中检查标志或信号量,如果标志未设置,则退出。

总结如下:

message queuetask scheduler和控制flag/semaphoreIHostedService都是按需运行较长任务的可行选项。最佳选项取决于您的特定用例和要求。

相关问题