我有一个网站页面,需要选择执行可能需要几分钟的操作。为了避免性能问题和超时,我希望在HTTP请求之外运行此操作。
经过一番研究,我找到了IHostedService
和BackgroundService
,它们可以使用AddHostedService<T>()
注册为单例。
但我担心的是托管服务总是在运行,当我只想让它按需运行时,这看起来不像是浪费资源吗?
有谁知道运行冗长任务的更好选择,或者不需要无休止运行的IHostedService
的使用方法吗?
- 请注意,操作调用并等待API调用。因此,我无法报告操作的进度,也无法在公共数据库中设置有关操作是否已完成的标志。*
1条答案
按热度按时间eh57zj3b1#
一个选项是使用**
message queue
。当请求操作时,您可以让Razor Pages网站向队列发送消息,并使用一个单独的服务(如后台工作进程**)从队列中使用消息并执行操作。这允许您将任务与Web请求分离。并且还允许添加更多工作者示例来处理工作负载的可能性。另一种选择是使用按需运行的**
task scheduler
,如Hangfire
。它允许您调度后台作业并监视其进度,这在您无法报告操作进度的情况下非常有用。您也可以使用
IHostedService
,但您需要确保**服务仅在需要时运行。您可以使用flag
或semaphore
来控制服务是否运行。您可以在请求操作时设置标志或信号量。并在操作完成时将其清除。然后,服务可以在其主循环中检查标志或信号量,如果标志未设置,则退出。总结如下:
message queue
、task scheduler
和控制flag/semaphore
的IHostedService
都是按需运行较长任务的可行选项。最佳选项取决于您的特定用例和要求。