private void CheckAndHandleWork() { if (!this.processIsolationEnabled) { this.allowedInstances = 1; } if (this.activeJobs.Count >= this.allowedInstances) { return; } if (this.userSettingService.GetUserSetting <bool>(UserSettingConstants.ClearCompletedFromQueue)) { this.ClearCompleted(); } QueueTask job = this.GetNextJobForProcessing(); if (job != null) { // Hardware encoders can typically only have 1 or two instances running at any given time. As such, we must have a HardwareResourceToken to continue. if (job.TaskToken == Guid.Empty) { return; // Hardware is busy, we'll try again later when another job completes. } if (CheckDiskSpace(job)) { return; // Don't start the next job. } this.jobIdCounter = this.jobIdCounter + 1; IEncode libEncode = new LibEncode(this.userSettingService, this.logInstanceManager, this.jobIdCounter, this.portService); ActiveJob activeJob = new ActiveJob(job, libEncode); activeJob.JobFinished += this.ActiveJob_JobFinished; activeJob.JobStatusUpdated += this.ActiveJob_JobStatusUpdated; this.activeJobs.Add(activeJob); activeJob.Start(); this.IsProcessing = true; this.InvokeQueueChanged(EventArgs.Empty); this.InvokeJobProcessingStarted(new QueueProgressEventArgs(job)); this.BackupQueue(string.Empty); } else { this.BackupQueue(string.Empty); if (!this.activeJobs.Any(a => a.IsEncoding)) { this.StopJobPolling(); // Fire the event to tell connected services. this.InvokeQueueCompleted(new QueueCompletedEventArgs(false)); } } }
private void ProcessNextJob() { if (!this.processIsolationEnabled) { this.allowedInstances = 1; } if (this.activeJobs.Count >= this.allowedInstances) { return; } if (this.userSettingService.GetUserSetting <bool>(UserSettingConstants.ClearCompletedFromQueue)) { this.ClearCompleted(); } QueueTask job = this.GetNextJobForProcessing(); if (job != null) { if (CheckDiskSpace(job)) { return; // Don't start the next job. } this.jobIdCounter = this.jobIdCounter + 1; ActiveJob activeJob = new ActiveJob(job, this.hbFunctionsProvider, this.userSettingService, this.logInstanceManager, this.jobIdCounter, this.portService); activeJob.JobFinished += this.ActiveJob_JobFinished; activeJob.JobStatusUpdated += this.ActiveJob_JobStatusUpdated; this.activeJobs.Add(activeJob); activeJob.Start(); this.IsProcessing = true; this.InvokeQueueChanged(EventArgs.Empty); this.InvokeJobProcessingStarted(new QueueProgressEventArgs(job)); this.BackupQueue(string.Empty); this.ProcessNextJob(); } else { this.BackupQueue(string.Empty); if (!this.activeJobs.Any(a => a.IsEncoding)) { // Fire the event to tell connected services. this.InvokeQueueCompleted(new QueueCompletedEventArgs(false)); } } }
public void Remove(QueueTask job) { lock (QueueLock) { ActiveJob activeJob = null; foreach (ActiveJob ajob in this.activeJobs) { if (Equals(ajob.Job, job)) { activeJob = ajob; ajob.Stop(); } } if (activeJob != null) { this.activeJobs.Remove(activeJob); } this.queue.Remove(job); this.InvokeQueueChanged(EventArgs.Empty); } }