[英]Long-running task without IHostedService running the entire life of the application?
我有一个网站页面,需要选择执行可能需要几分钟的操作。 为避免性能问题和超时,我想在 HTTP 请求之外运行此操作。
经过一些研究,我找到IHostedService
和BackgroundService
,它们可以使用AddHostedService<T>()
注册为 singleton 。
但我担心的是托管服务始终在运行。 当我只希望它按需运行时,这不是浪费资源吗?
有谁知道运行冗长任务的更好选择,或者使用不需要无休止运行的IHostedService
的方法?
请注意,该操作调用并等待 API 调用。 因此我无法报告操作的进度,也无法在公共数据库中设置标志以判断操作是否已完成。
按需运行冗长任务同时避免性能问题和超时的一种选择是使用message queue
。 您可以让您的 Razor Pages 网站在请求操作时向队列发送消息,并让单独的服务(例如后台工作人员)使用队列中的消息并执行操作。 这允许您将任务与 web 请求分离,并且还允许添加更多工作实例来处理工作负载的可能性。
另一种选择是使用按需运行的task scheduler
,例如Hangfire
。 它允许您安排后台作业并监视它们的进度,这在您无法报告操作进度的情况下非常有用。
您也可以使用IHostedService
,但您需要确保该服务仅在需要时运行。 您可以使用flag
或semaphore
来控制服务是否正在运行。 您可以在请求操作时设置标志或信号量,并在操作完成时将其清除。 然后服务可以在其主循环中检查标志或信号量,如果未设置标志则退出。
总之:
message queue
、 task scheduler
和带有控制flag/semaphore
的IHostedService
都是按需运行冗长任务的可行选项。 最佳选择取决于您的具体用例和要求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.