Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从NET Core中的REST调用启动BackgroundService ExecuteAsync方法_C#_Asp.net Core_.net Core_Background Service - Fatal编程技术网

C# 从NET Core中的REST调用启动BackgroundService ExecuteAsync方法

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使用。如果我正确理解您的问题,您可以

我已经实现了一个netcorebackgroundservice。它的方法
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开始,只需将新的“挂起的作业”插入表中。是要启动作业还是只从控制器执行一次操作?