ABP VNext 后台作业和后台工作者
1、后台作业和后台工作者的区别是后台作业在接受到任务之后,只执行一次。后台工作者是会在服务启动后,通过被设定的间隔事件,不断循环执行代码块中的代码。
2、后台工作者需要时间AsyncPeriodicBackgroundWorkerBase接口,然后在构造函数中注入AbpAsyncTimer和IServiceScopeFactory,
还需要在服务中注册 await context.AddBackgroundWorkerAsync<PassiveUserCheckerWorker>();
public class PassiveUserCheckerWorker : AsyncPeriodicBackgroundWorkerBase { public PassiveUserCheckerWorker( AbpAsyncTimer timer, IServiceScopeFactory serviceScopeFactory ) : base( timer, serviceScopeFactory) { Console.WriteLine("我草!阿珍,你来真的1?"); Timer.Period = 5000; Console.WriteLine("我草!阿珍,你来真的2?"); } protected override async Task DoWorkAsync(PeriodicBackgroundWorkerContext workerContext) { Console.WriteLine("我草!阿珍,你来真的3?"); await Task.CompletedTask; } }
在XXXXXXModule类中OnApplicationInitialization方法内添加
await context.AddBackgroundWorkerAsync<PassiveUserCheckerWorker>();
或者在任何地方注入IBackgroundWorkerManager,并注入对应的后台工作者
当昨晚这些,运行程序之后,后台任务就会根据你设置的间隔事件不断运行。
3、后台作业后台作业是实现了IBackgroundJob<类>,并且需要是需要注入ID,继承ITransientDependency,然后实现IBackgroundJob的方法,并在其中实现对应的后台作业逻辑,只需要在触发的类中构造函数中获取IBackgroundJobManager类的服务,然后使用对应的EnqueueAsync方法,传入对应的类型,后台作业就会根据类型自动找到对应的后台作业。
//触发控制器示例 public class ValuesController : ControllerBase { private readonly IBackgroundJobManager _manager; public ValuesController( IBackgroundJobManager manager ) { _manager = manager; } [HttpGet] public void Witchs(int num) { _manager.EnqueueAsync(num); } } //后台作业类 public class MyBackgroundJob2 : BackgroundJob<int>, ITransientDependency { public override void Execute(int args) { Console.WriteLine($"我草2,被你发现了{args}"); } }
通常后台作业使用的是Dto类型,后台作业只会根据Dto去寻找对应的后台作业类,并实现对应的代码逻辑,所以需要尽量一个后台作业使用一个Dto,不要重复Dto