繁体   English   中英

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

[英]Long-running task without IHostedService running the entire life of the application?

我有一个网站页面,需要选择执行可能需要几分钟的操作。 为避免性能问题和超时,我想在 HTTP 请求之外运行此操作。

经过一些研究,我找到IHostedServiceBackgroundService ,它们可以使用AddHostedService<T>()注册为 singleton 。

但我担心的是托管服务始终在运行。 当我只希望它按需运行时,这不是浪费资源吗?

有谁知道运行冗长任务的更好选择,或者使用不需要无休止运行的IHostedService的方法?

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

按需运行冗长任务同时避免性能问题和超时的一种选择是使用message queue 您可以让您的 Razor Pages 网站在请求操作时向队列发送消息,并让单独的服务(例如后台工作人员)使用队列中的消息并执行操作。 这允许您将任务与 web 请求分离,并且还允许添加更多工作实例来处理工作负载的可能性。

另一种选择是使用按需运行的task scheduler ,例如Hangfire 它允许您安排后台作业并监视它们的进度,这在您无法报告操作进度的情况下非常有用。

您也可以使用IHostedService ,但您需要确保该服务仅在需要时运行。 您可以使用flagsemaphore来控制服务是否正在运行。 您可以在请求操作时设置标志或信号量,并在操作完成时将其清除。 然后服务可以在其主循环中检查标志或信号量,如果未设置标志则退出。

总之:

message queuetask scheduler和带有控制flag/semaphoreIHostedService都是按需运行冗长任务的可行选项。 最佳选择取决于您的具体用例和要求。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM