Exemplo n.º 1
0
 /// <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);
 }
Exemplo n.º 2
0
        /// <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);
            }
        }
Exemplo n.º 3
0
        /// <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);
        }