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); } }
public void Run() { BackgroundWorkerQueueRunArg <T> runArg = new BackgroundWorkerQueueRunArg <T>(jobs, IdleWaitTime, MaxConcurrentJobCount); backgroundWorker.RunWorkerAsync(runArg); }