Beispiel #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);
        }
Beispiel #2
0
 public R Use <R, V>(IResultingBackgroundWorkerParamDelegate <R, V> runnable, V arg)
 {
     Object[] oldValues = SetThreadLocals();
     try
     {
         return(runnable(arg));
     }
     finally
     {
         RestoreThreadLocals(oldValues);
     }
 }
Beispiel #3
0
        public R InvokeInGuiAndWait <R, P>(IResultingBackgroundWorkerParamDelegate <R, P> callback, P state)
        {
            if (IsInGuiThread() || SyncContext == null)
            {
                return(callback(state));
            }
            R result = default(R);

            SyncContext.Send(delegate(Object state2)
            {
                result = callback(state);
            }, null);
            return(result);
        }
        public R ExecuteWithCache <R, T>(ICacheProvider cacheProvider, IResultingBackgroundWorkerParamDelegate <R, T> runnable, T state)
        {
            ParamChecker.AssertParamNotNull(cacheProvider, "cacheProvider");
            ParamChecker.AssertParamNotNull(runnable, "runnable");
            Stack <ICacheProvider> stack = cacheProviderStackTL.Value;

            if (stack == null)
            {
                stack = new Stack <ICacheProvider>();
                cacheProviderStackTL.Value = stack;
            }
            stack.Push(cacheProvider);
            try
            {
                return(runnable(state));
            }
            finally
            {
                if (!Object.ReferenceEquals(stack.Pop(), cacheProvider))
                {
                    throw new Exception("Must never happen");
                }
            }
        }
Beispiel #5
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);
        }
Beispiel #6
0
 public ResultingRunnableHandle(IResultingBackgroundWorkerParamDelegate <R, V> run, IAggregrateResultHandler <R, V> aggregrateResultHandler, IList <V> items, IThreadLocalCleanupController threadLocalCleanupController) : base(items, threadLocalCleanupController)
 {
     this.run = run;
     this.aggregrateResultHandler = aggregrateResultHandler;
 }
 public R ExecuteWithCache <R, T>(ICache cache, IResultingBackgroundWorkerParamDelegate <R, T> runnable, T state)
 {
     ParamChecker.AssertParamNotNull(cache, "cache");
     ParamChecker.AssertParamNotNull(runnable, "runnable");
     return(ExecuteWithCache <R, T>(new SingleCacheProvider(cache), runnable, state));
 }
 public R ExecuteWithCache <R, T>(IResultingBackgroundWorkerParamDelegate <R, T> runnable, T state)
 {
     return(ExecuteWithCache(ThreadLocalCacheProvider, runnable, state));
 }