ABP VNext 后台作业和后台工作者

发布时间 2023-06-27 00:14:54作者: 仲夏不凉爽

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