问题标签 [asp.net-core-hosted-services]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
848 浏览

c# - 将具有范围服务依赖关系的任务放在单例队列中是否安全?

我几乎使用 Microsoft 文档中提供的示例来排队后台任务

在这个队列中,我添加了一个Func<Task>, 稍后由QueuedHostedService.

控制器 - HTTP POST

模拟服务.DoWorkAsync

BackgroundTaskQueue.QueueBackgroundWorkItem

QueuedHostedService.ExecuteAsync

BackgroundTaskQueue.DequeueAsync

启动.ConfigureServices

IMockService.DoWorkAsync方法使用scoped服务。将此方法的引用添加到驻留在singleton服务中的队列中。该队列稍后由HostedService也是 a的 a 读取singleton

是否有可能在DoWorkAsync处理之前处理服务引用HostedService?如果我们排除应用程序正常(或不正常)关闭的场景。

一些可能有一百个请求的本地测试运行(以及一些添加Task.Delay的请求DoWorkAsync)似乎工作正常,但我不确定我是否遗漏了什么..

0 投票
1 回答
67 浏览

c# - 在方法覆盖中访问字典项

我在 webapi 中有以下类,它添加到字典中,但是每次触发 checkstatus 方法(使用 Task.Delay)时,它都说字典为空。这是因为它在不同的线程上运行吗?我应该改用并发字典吗?

基类代码如下。

下面是启动cs

0 投票
1 回答
3638 浏览

c# - 如何将数据从控制器传递到后台服务

我正在尝试编写一个简单的 Web api 项目,其后台服务每秒执行一个方法。此方法循环遍历列表并仅打印出(目前)一些统计信息。我在后台服务的构造函数中声明了一个新列表。

我目前在控制器内部添加和删除项目时遇到了一些问题。

我希望每次调用 PostUser() 时,用户列表都应该增加,并且我的 GenerateStatistics() 方法应该打印出正确的值,而不是打印出的只是用户 0 的 Nr。

我将该服务注册为托管服务和单例。我暂时从代码中省略了一些东西,因为我在这台机器上没有代码。

0 投票
1 回答
1895 浏览

asp.net-core - 如何确保只有一个 IHostedService 实例在 .NET core 2.2 Web API 中运行

我有一个 .NET Core 2.2 Web API,可以根据需要扩展到多个实例。此 API 有一个后台服务 (IHostedService),一次只能在其中一个实例上运行。

是否有一种通用方法或设计模式来确保此服务在任何给定时间点仅在一个实例上运行?

0 投票
2 回答
590 浏览

asp.net-core - 负载平衡环境中的 .Net Core 托管服务

我们正在使用 .Net Core 开发 Web API。为了执行后台任务,我们使用了托管服务。

系统已使用负载均衡器托管在 AWS Beantalk 环境中。因此,基于负载 Beanstalk 创建/删除系统的新实例。

我们的问题是,由于后台服务也在 API 内部运行,当负载均衡器增加实例时,后台服务的数量也会增加,并且有可能多次执行相同的任务。理想情况下,应该只有一个后台服务实例。

解决此问题的一种方法是在负载平衡环境中停止执行后台服务,并为后台服务提供专用的非负载平衡单实例环境。

这是一个有点丑陋的解决方案。所以,

1)有没有更好的解决方案?

2) 有没有办法在负载平衡环境中识别主实例?如果是这样,我可以有条件地注册托管服务。

非常感谢任何帮助。

谢谢

0 投票
0 回答
144 浏览

c# - 如何为可以启动和停止的单例作业实现托管服务?

我想创建一个可以通过用户交互启动和停止的托管服务。该服务应该自动启动,在它已经启动时尝试启动它应该没有效果,并且应该可以检查该服务当前是否正在运行。该服务最终将完成运行,此时它应该转换到停止状态,直到它再次启动。

下面是我实现这一点的尝试,它似乎正在工作,但我想知道这种方法是否存在任何明显的缺陷,或者是否有更简单的解决方案。

有两个部分,一个FooJobControl可以注入到控制器中以启动或停止服务的单例,以及FooJob等待来自的信号FooJobControl开始工作并在它停止时发出信号的托管服务。

在 Startup.cs

FooJobControl.cs

FooJob.cs

0 投票
1 回答
772 浏览

c# - 具有范围托管服务的实体框架

我有以下界面

和实施

此代码来自微软官方文档。后台范围服务

就像在文档中一样,我有ScopedProcessingService一些更困难的。这是代码:

Startup.cs类中,我使用以下代码注入它:

这条线的问题var templates = _pushTemplateRepository.PushTemplates.Where(x => x.isActive)。如果我使用 a 进行一些更改,PushTemplate此更改将不会对后台任务产生影响。我将处理旧数据。我的意思是,如果我更改 a 的名称PushTemplate,例如,将 id = 15 从Name_1to更改Name_2为我将Name_1在后台任务中使用的名称。

如何EF正确注入 Scoped 后台服务?我不使用明确的 EF 上下文。我有存储库层。

和实施

0 投票
1 回答
205 浏览

c# - 是否可以一项一项地运行我的作业(基于 Scoped Background Services)?

前段时间,我在“System.Timers”的帮助下创建了自己创建的调度程序。我将向您展示这段代码:

所以,为了确保我在开始新的工作之前完成了一项工作,我只是在开始工作后直接取消我的计时器。然后,当工作完成后,我打开计时器。当多个并行作业试图访问资源或一起写入数据库时​​,这有助于我避免错误。而我的业务规则直接告诉我:工作是一个接一个,而不是一起。

一切都很好,但我决定重写 Scoped Hosted Background 服务。这是微软文档。我会告诉你结果:

IScopedProcessingService

ConsumeScopedServiceHostedService

ScopedProcessingService

而在Startup.cs

那么如何保护我的应用程序免受并行作业的影响?我需要一个一个。在上面的示例中,下一个任务将在 10 秒后开始。但是,如果我猜对了,之前的任务会在这个时候继续进行!这意味着我的数据库可能因此而混乱。

0 投票
1 回答
3036 浏览

c# - 如何在 .Net Core 3 中引用托管服务?

回到 .net core 2,我创建了一个具有自定义属性的托管服务,例如:

我可以在 startup.cs 中设置,例如:

然后我可以在剃须刀页面的其他地方引用它,例如:

现在我已升级到 .net core 3,我的启动已更改为:

但是我在 IndexModel 中的 DI 引用不再给我 MyService,而是给了我一个 GenericWebHostService 类型的对象,我不知道如何从中获取我的自定义 MyService。在 IndexModel 中将“IHostedService”更改为“MyService”也不起作用,我收到“无法解析服务”错误。

如何从依赖注入中获取 MyService 的实例?

0 投票
1 回答
1844 浏览

c# - 如何以编程方式停止 HostedService?

我正在构建一个 dotnet 核心 HostedService 应用程序。我需要在一段时间后停止申请。

我怎样才能阻止它?

我试图添加到 StartAsync 方法

主要的:

它不起作用。我怎样才能正确地阻止它?