/// <summary> Creates a new instance that operates with the given values. </summary> /// <param name="onExecute"></param> /// <param name="stateObj"></param> /// <param name="jobName"></param> public JobHandle(JobExecutionHandler onExecute, object stateObj, string jobName) { _jobExecutionHandler = onExecute; _stateObject = stateObj; _jobName = jobName; _waitHandle = new ManualResetEventSlim(false); }
/// <summary> Is invoked when a task for a job is being executed. </summary> /// <param name="dataStore">Data store object array</param> private void OnTaskExecution(object[] dataStore) { string jobName = null; try { JobExecutionHandler onExecute = (JobExecutionHandler)dataStore[0]; object onExecuteState = dataStore[1]; jobName = (string)dataStore[2] ?? "unnamed"; using (IProgressMonitor progressMonitor = UIFactory.NewService <IProgressMonitor>()) { onExecute(progressMonitor, onExecuteState); } } catch (ThreadAbortException ex) { Thread.ResetAbort(); _log.Fatal("Thread has been explicitly cancelled!", ex); } catch (Exception ex) { _log.Error($"Error on executing job '{jobName}'.", ex); } }
/// <inheritdoc /> public IJobHandle Schedule(JobExecutionHandler onExecute, object state, string jobName) { if (onExecute == null) { throw new ArgumentNullException(nameof(onExecute)); } JobHandle jobHandle = new JobHandle(onExecute, state, jobName); lock (_jobQueue) { _jobQueue.Enqueue(jobHandle); } using (_processingQueue.Lock()) { if (!_processingQueue.Get()) { _processingQueue.Set(true); ThreadPool.QueueUserWorkItem(ProcessJobQueue, _jobQueue); } } return(jobHandle); }