【发布时间】:2020-09-25 02:17:19
【问题描述】:
我有一个带有 WebAPI 控制器的 ASP.NET Core Web 应用程序。我所要做的就是,在某些控制器中,能够启动一个将在后台运行的进程,但控制器应该继续并在该进程完成之前返回。我不希望服务的消费者不得不等待这项工作完成。
我看过所有关于 IHostedService 和 BackgroundService 的帖子,但似乎没有一个是我想要的。此外,所有这些示例都向您展示了如何设置,而不是如何实际调用它,或者我不理解其中的一些。
我尝试了这些,但是当您在 Startup 中注册 IHostedService 时,它会在那个时间点立即运行。这不是我想要的。我不想在启动时运行任务,我希望能够在需要时从控制器调用它。另外,我可能有几个不同的,所以只注册 services.AddHostedService() 是行不通的,因为我可能有一个 MyServiceB 和 MyServiceC,那么我如何从控制器中获得正确的一个(我不能只注入 IHostedService) ?
最终,我所看到的一切都是一大堆错综复杂的代码,而这些代码看起来应该是一件很简单的事情。我错过了什么?
【问题讨论】:
-
你试过异步方法吗? (文档:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…)
-
你不会打电话给
IHostedService,你会以某种方式向它发送消息。默认示例之一 - 文档中的 Queued background tasks(在这种情况下,Func<CancellationToken, Task> workItem是消息)。 -
“这应该是一件很简单的事情”——这很好,但它根本不是一件简单的事情。当零保证代码尝试运行的进程将停留足够长的时间以使该代码完成时,很难确保代码可预测地完成。
标签: c# asp.net-core .net-core