示例#1
0
        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);
        }
示例#2
0
        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);
        }