C# 从NET Core中的REST调用启动BackgroundService ExecuteAsync方法
我已经实现了一个netcorebackgroundservice。它的方法C# 从NET Core中的REST调用启动BackgroundService ExecuteAsync方法,c#,asp.net-core,.net-core,background-service,C#,Asp.net Core,.net Core,Background Service,我已经实现了一个netcorebackgroundservice。它的方法ExecuteAsync在程序启动时运行,并且工作正常 但是,我如何不仅从程序开始执行后台作业(位于ExecuteAsync方法的BackgroundService接口中),还可以通过REST调用执行后台作业?如果我了解您试图实现的目标,则无法直接将“worker”作业插入后台服务。 但是,您可以在队列(队列、数据库或其他)中安排作业,或使用事件消息系统让backgroundworker使用。如果我正确理解您的问题,您可以
ExecuteAsync
在程序启动时运行,并且工作正常
但是,我如何不仅从程序开始执行后台作业(位于
ExecuteAsync
方法的BackgroundService
接口中),还可以通过REST调用执行后台作业?如果我了解您试图实现的目标,则无法直接将“worker”作业插入后台服务。
但是,您可以在队列(队列、数据库或其他)中安排作业,或使用事件消息系统让backgroundworker使用。如果我正确理解您的问题,您可以这样做:
public class Controller
{
private readonly IServiceProvider _serviceProdiver;
public Controller(IServiceProvider serviceProdiver)
{
_serviceProvider = serviceProvider;
}
public async Task RunAllBackgroundServices()
{
var allBackgroundServices = _serviceProvider.GetServices<IHostedService>();
foreach(var hostedService in allBackgroundServices)
{
await hostedService.StartAsync(CancellationToken.None);
}
}
}
公共类控制器
{
专用只读服务器ViceProvider\u ServiceProDriver;
公共控制器(IServiceProvider服务生产驱动程序)
{
_服务提供者=服务提供者;
}
公共异步任务RunAllBackgroundServices()
{
var allBackgroundServices=_serviceProvider.GetServices();
foreach(所有后台服务中的var hostedService)
{
wait hostedService.StartAsync(CancellationToken.None);
}
}
}
使用DI,您将获取
IHostedService的所有实现并运行它们。不确定我是否正确理解您的问题。你想从REST电话开始后台服务吗?不是在通过.AddHostedService
启动应用程序时,对吗?如果它打算作为后台服务,那么您不会通过REST调用直接启动它。相反,您可以让它从某种队列中处理作业。您可以通过一个定期检查队列中新工作的调度库(例如)来实现这一点。或者,您可以通过消息队列服务(如RabbitMQ或Azure服务总线)执行此操作,也可以使用。创建一个表或其他存储机制,并让您的BackgroundService从该表中拾取“挂起的作业”。然后,从REST开始,只需将新的“挂起的作业”插入表中。是要启动作业还是只从控制器执行一次操作?