Exemple #1
0
        private static void BackgroundWorker_DoWork(object sender, DoWorkEventArgs e)
        {
            BackgroundWorker backgroundWorker      = sender as BackgroundWorker;
            BackgroundWorkerQueueRunArg <T> runArg = e.Argument as BackgroundWorkerQueueRunArg <T>;
            T   task = default(T);
            int concurrentJobCount = 0;

            while (!backgroundWorker.CancellationPending)
            {
                if (runArg.Jobs.Count == 0
                    // TODO
                    //	|| concurrentJobCount == runArg.MaxConcurrentJobCount
                    || runArg.MaxConcurrentJobCount > 1 ||                  // HACK
                    (task != null && task.IsBusy()))                        // force sequential processing.
                {
                    Thread.Sleep(runArg.IdleWaitTime);
                    continue;
                }

                if (task != null)
                {
                    --concurrentJobCount;
                }

                task = runArg.Jobs.Dequeue();

                ++concurrentJobCount;

                backgroundWorker.ReportProgress(0, task);
            }
        }
Exemple #2
0
        public void Run()
        {
            BackgroundWorkerQueueRunArg <T> runArg = new BackgroundWorkerQueueRunArg <T>(jobs, IdleWaitTime, MaxConcurrentJobCount);

            backgroundWorker.RunWorkerAsync(runArg);
        }