public void InvokeAndWait <R, K, V>(IMap <K, V> items, IResultingBackgroundWorkerParamDelegate <R, Entry <K, V> > itemHandler, IAggregrateResultHandler <R, Entry <K, V> > aggregateResultHandler) { if (items.Count == 0) { return; } if (!IsMultiThreadingAllowed() || items.Count == 1) { foreach (Entry <K, V> item in items) { R result = itemHandler(item); if (aggregateResultHandler != null) { aggregateResultHandler(result, item); } } return; } List <Entry <K, V> > itemsList = new List <Entry <K, V> >(items.Count); foreach (Entry <K, V> item in items) { itemsList.Add(item); } ResultingRunnableHandle <R, Entry <K, V> > runnableHandle = new ResultingRunnableHandle <R, Entry <K, V> >(itemHandler, aggregateResultHandler, itemsList, ThreadLocalCleanupController); Runnable parallelRunnable = new ResultingParallelRunnable <R, Entry <K, V> >(runnableHandle, true); Runnable mainRunnable = new ResultingParallelRunnable <R, Entry <K, V> >(runnableHandle, false); QueueAndWait(items.Count - 1, parallelRunnable, mainRunnable, runnableHandle); }
public void InvokeAndWait <R, V>(IList <V> items, IResultingBackgroundWorkerParamDelegate <R, V> itemHandler, IAggregrateResultHandler <R, V> aggregateResultHandler) { if (items.Count == 0) { return; } if (!IsMultiThreadingAllowed() || items.Count == 1) { for (int a = items.Count; a-- > 0;) { V item = items[a]; R result = itemHandler(item); aggregateResultHandler(result, item); } return; } ResultingRunnableHandle <R, V> runnableHandle = new ResultingRunnableHandle <R, V>(itemHandler, aggregateResultHandler, items, ThreadLocalCleanupController); Runnable parallelRunnable = new ResultingParallelRunnable <R, V>(runnableHandle, true); Runnable mainRunnable = new ResultingParallelRunnable <R, V>(runnableHandle, false); QueueAndWait(items.Count - 1, parallelRunnable, mainRunnable, runnableHandle); }