【发布时间】:2020-01-04 10:38:07
【问题描述】:
在 .net core 3.1 worker 服务项目中有两个不同的 worker (BackgroundService):
services.AddHostedService<MainTaskWorker>();
services.AddHostedService<SideTaskWorker>();
如果MainTaskWorker 正在运行,是否可以阻止SideTaskWorker?
Worker 实现(简化) - Main 和 Side 相同:
public class SideTaskWorker : BackgroundService
{
private readonly ILogger<SideTaskWorker> _logger;
public SideTaskWorker(ILogger<SideTaskWorker> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("SideTask running at: {time}", DateTime.UtcNow);
}
}
}
附加信息:
MainTask - 每天运行,需要几分钟/几小时才能完成
SideTask - 每 15 分钟运行一次,需要几秒/分钟才能完成
SideTaskWorker 和MainTaskWorker 是两个不同的类,ExecuteAsync 方法的实现不同。问题是两个工作人员都在修改相同的数据库表,而当MainTask 当前正在运行时,我不想使用SideTask 触摸表。
SideTask 不是业务关键,可以被阻止几分钟/几小时/几天。 db 表中的数据不应更改,因为MainTask 的功能之一是根据 db 中的数据生成报告
【问题讨论】:
-
您应该提供更多信息,说明您希望如何以及何时阻止
BackgroundService。 -
您是否只想在这些方法同时尝试访问您的表时防止数据冲突?
-
需要防止在主任务运行时更改数据。
MainTask运行时,SideTask不应更改数据。 -
所以我想从你的问题来看,如果代码不会连续多次在
SideTask中执行,这并不重要? -
是的,
SideTask不是关键业务,可以被阻止几分钟/几小时/几天。 db 表中的数据不应更改,因为MainTask的功能之一是根据 db 中的数据生成报告
标签: c# asp.net-core .net-core