private void Execute(TreeJob treeJob) { lock (this._runningJobsLock) { this._threadCounter.Increment(); treeJob.State = TreeJobState.Running; this._runningJobs.Add(treeJob); OnJobChanged(treeJob, TreeJobChangedEvent.RunningAdded); } Task.Factory.StartNew(treeJob.Action) .ContinueWith(t => { lock (this._runningJobsLock) { this._runningJobs.Remove(treeJob); } treeJob.State = TreeJobState.Completed; OnJobCompleted(treeJob); Progress.AddItems(treeJob.PromisedChildCount); Progress.CompleteItems(1); this._threadCounter.Decrement(); OnJobChanged(treeJob, TreeJobChangedEvent.RunningCompleted); CheckOnCompleted(); }) .ContinueOnException(t => { if (t.Exception != null) { log.ErrorFormat("Error occurred while processing task completion: {0}", t.Exception); } }); }