`Coravel`不仅可以执行后台定时程序,还具备队广播事件功能。 引用 ``` ``` # 后台定时程序 如果执行后台定时程序,需要定义一个`IInvocable`对象 ``` public class RegisterDevices : IInvocable { ublic async System.Threading.Tasks.Task Invoke() { } } ``` 注入到容器中 ``` services.AddScheduler();//计划 services.AddQueue();//队列 services.AddEvents();//广播 services.AddTransient();//注册IInvocable ``` 在请求管道中配置 频率等行为 ``` var provider = app.ApplicationServices; ;//获取IServiceProvider provider.UseScheduler(s => { #region 本地相关 //更新所有模块的上传频率 s.OnWorker("WRegisterDevices");//让任务之间并行不会有延时影响 s.Schedule() .Cron("*/1 * * * *")//每1分钟运行一次 .PreventOverlapping("RegisterDevices");//当第一次执行不完,第二次就不执行 }) .OnError(exception => { Console.WriteLine(exception.Message); }); ``` # 事件广播 `Coravel`会把事件放队列中,依次执行。 定义事件。 ``` public class SceneExecuted : IEvent { public SceneArgs SceneArgs { get; set; } public SceneExecuted(SceneArgs sceneArgs) { SceneArgs = sceneArgs; } } public class SceneArgs { public string SceneId { get; set; } public string SceneScheduleId { get; set; } public string StartTime { get; set; } } ``` 定义事件观察者。 ``` public class SceneExecuteListener : IListener { public async System.Threading.Tasks.Task HandleAsync(SceneExecuted broadcasted) { } } ``` 在容器中注册 ``` services.AddTransient(); //IEvent services.AddTransient();//IListener services.AddTransient(); ``` 在请求管道中定义事件行为 ``` //事件 IEventRegistration registration = provider.ConfigureEvents(); //场景的执行情况上传到云端,cloudgo=1时执行 registration .Register() .Subscribe(); //队列 provider .ConfigureQueue() //.LogQueuedTaskProgress(Services.GetService>()) .OnError(exception => { Console.WriteLine(exception.Message); }); ``` 在`appsettings.json`中定义队列间隔 ``` "Coravel": { "Queue": { "ConsummationDelay": 30 //队列项的等待时间 } } ```