private void JobRunner() { while (true) { _enqueueSignal.WaitOne(); while (JobQueue.Count > 0) { Job job = null; lock (_jobQueueLock) { if (JobQueue.Count > 0) { job = JobQueue.Dequeue(); } } if (job != null) { job.JobFinished += (o, a) => { Job j = (Job)o; if (Running.Contains(j)) { Running.Remove(j); } _runCompleteSignal.Set(); }; RunJob(job); } } } }