private void Dispatch() { _isRunning = true; try { Job job = null; for (;;) { lock (_dispatcher) { if (_isPaused || _jobs.Count == 0) { Monitor.Wait(_dispatcher); } if (_isRunning == false) { break; } job = (Job)_jobs.Peek(); if (job.IsReady == false) { Monitor.Wait(_dispatcher, job.Next.Subtract(DateTime.Now)); } if (_isRunning == false) { break; } if (job.IsReady == false) { continue; } _jobs.Dequeue(); } job.Run(); job = null; } } catch (ThreadInterruptedException) { Trace.WriteLine("JobDispatcher.Dispatch: ThreadInterruptException"); } catch (Exception e) { Trace.WriteLine("JobDispatcher.Dispatch: {0}", e.Message); } _isRunning = false; }