예제 #1
0
        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;
        }