private void TryEnqueueJobs(PipelineMessage pMessage) { string sessionId = pMessage.Id; string appId = pMessage.Targets[WidgetConst.PMSGIDX_APPID]; string[] scopes = pMessage.Targets[WidgetConst.PMSGIDX_SCOPES].Split(';'); void EnqueueJob(dynamic profile) { string profileJson = ((object)(profile.User)).ToJson(); string profileName = profile.System.ProfileName; string procedure = profile.System.Procedure; string cronExpression = profile.System.CronExpression; int maxAge = profile.System.MaxAge; BackgroundJob.Enqueue <TrackerBuilder>(t => t.AddSessionState( sessionId, nameof(SessionStates.Pending))); string syncJob = $"{appId}.{profileName}"; if (!SchedulerJobs.Contains(syncJob)) { var scheduler = new Scheduler { CronExpression = cronExpression }; scheduler.OnTime += (s, e) => { BackgroundJob.Enqueue <TrackerBuilder>(t => t.SyncSessionStates(procedure, profileJson)); }; SchedulerJobs.Add(syncJob); Task.Run(() => { scheduler.Start(); scheduler.Dispose(); }); Task.Run(() => { SpinWait.SpinUntil(() => false, maxAge); scheduler.Abort(); SchedulerJobs.Remove(syncJob); }); } } try { var profiles = Profile.LoadProfile(appId, Const.PLUGIN_NAME, scopes); Parallel.ForEach(profiles, profile => { EnqueueJob(profile); }); } catch (AggregateException e) { foreach (var ie in e.InnerExceptions) { Logger.LogError(ie, ie.ToString()); } } catch (Exception e) { Logger.LogError(e, e.ToString()); } }