Exemplo n.º 1
0
        internal ParallelQueue <InvokePart> FillWithInvoke(InvokeAction[] actions)
        {
            ParallelQueue <InvokePart> parallelQueue = new ParallelQueue <InvokePart>();

            foreach (InvokeAction invokeAction in actions)
            {
                InvokePart invokePart = new InvokePart();
                invokePart.InvokationParts.Add(invokeAction);
                parallelQueue.Enqueue(invokePart);
            }
            return(parallelQueue);
        }
Exemplo n.º 2
0
        internal ParallelQueue <InvokePart <T> > FillWithInvoke <T>(InvokeAction <T>[] actions, T value)
        {
            ParallelQueue <InvokePart <T> > parallelQueue = new ParallelQueue <InvokePart <T> >();

            foreach (InvokeAction <T> invokeAction in actions)
            {
                InvokePart <T> invokePart = new InvokePart <T>();
                invokePart.InvokationParts.Add(invokeAction);
                invokePart.Value = value;
                parallelQueue.Enqueue(invokePart);
            }
            return(parallelQueue);
        }
Exemplo n.º 3
0
        internal ParallelQueue <InvokePart <T1, T2> > FillWithInvoke <T1, T2>(InvokeAction <T1, T2>[] actions, T1 value1, T2 value2)
        {
            ParallelQueue <InvokePart <T1, T2> > parallelQueue = new ParallelQueue <InvokePart <T1, T2> >();

            foreach (InvokeAction <T1, T2> invokeAction in actions)
            {
                InvokePart <T1, T2> invokePart = new InvokePart <T1, T2>();
                invokePart.InvokationParts.Add(invokeAction);
                invokePart.Value1 = value1;
                invokePart.Value2 = value2;
                parallelQueue.Enqueue(invokePart);
            }
            return(parallelQueue);
        }
        public void InvokeExecution <T1, T2>(T1 value1, T2 value2, params InvokeAction <T1, T2>[] actions)
        {
            chunk = (actions.Length) / processorCount;
            int start = 0;
            int end   = chunk;

            for (int i = 1; i <= processorCount; i++)
            {
                int x = i - 1;
                waitHandles[x] = new ManualResetEvent(false);
                InvokePart <T1, T2> invokePart = new InvokePart <T1, T2>();
                invokePart.Value1 = value1;
                invokePart.Value2 = value2;
                for (int j = start; j <= end; j++)
                {
                    invokePart.InvokationParts.Add(actions[j]);
                }
                ConstantInvokeSynchronisationContainer <T1, T2> invokeSynchronisationContainer =
                    new ConstantInvokeSynchronisationContainer <T1, T2>((ManualResetEvent)waitHandles[x], invokePart);
                ThreadPool.QueueUserWorkItem(
                    delegate(object state)
                {
                    ConstantInvokeSynchronisationContainer <T1, T2> localinvokeSynchronisationContainer = (ConstantInvokeSynchronisationContainer <T1, T2>)state;
                    InvokePart <T1, T2> localInvokePart = localinvokeSynchronisationContainer.InvokePart_;
                    try
                    {
                        foreach (InvokeAction <T1, T2> invokeAction in localInvokePart.InvokationParts)
                        {
                            invokeAction.Invoke(localInvokePart.Value1, localInvokePart.Value2);
                        }
                    }
                    finally
                    {
                        localinvokeSynchronisationContainer.ManualResetEvent_.Set();
                    }
                }, invokeSynchronisationContainer);
                start = end + 1;
                end   = end + chunk;
            }
            WaitHandle.WaitAll(waitHandles);
        }
 public ConstantInvokeSynchronisationContainer(ManualResetEvent manualResetEvent, InvokePart invokePart_)
     : base(manualResetEvent)
 {
     this.invokePart_ = invokePart_;
 }
        public void InvokeExecution(ExecutionConstancyEnum executionConstancy, InvokeAction[] actions)
        {
            if (executionConstancy == ExecutionConstancyEnum.Constant)
            {
                InvokeExecution(actions);
            }
            else
            {
                ParallelQueue <InvokePart>[] parallelQueues = new ParallelQueue <InvokePart> [processorCount];
                chunk = (actions.Length) / processorCount;
                int start = 0;
                int end   = chunk;

                for (int i = 1; i <= processorCount; i++)
                {
                    int x = i - 1;
                    waitHandles[x] = new ManualResetEvent(false);
                    ParallelQueueFiller parallelQueueFiller       = new ParallelQueueFiller();
                    List <InvokeAction> perProcessorInvokeActions = new List <InvokeAction>();
                    for (int j = start; j <= end; j++)
                    {
                        perProcessorInvokeActions.Add(actions[j]);
                    }
                    ParallelQueue <InvokePart> parallelQueue = parallelQueueFiller.FillWithInvoke(perProcessorInvokeActions.ToArray());
                    parallelQueues[x] = parallelQueue;
                    UnconstantInvokeSynchronisationContainer unconstantInvokeSynchronisationContainer =
                        new UnconstantInvokeSynchronisationContainer((ManualResetEvent)waitHandles[x], parallelQueue, parallelQueues);
                    ThreadPool.QueueUserWorkItem(
                        delegate(object state)
                    {
                        UnconstantInvokeSynchronisationContainer localUnconstantInvokeSynchronisationContainer =
                            (UnconstantInvokeSynchronisationContainer)state;
                        ParallelQueue <InvokePart> localparallelQueue    = localUnconstantInvokeSynchronisationContainer.ParallelQueue;
                        ParallelQueue <InvokePart>[] localparallelQueues = localUnconstantInvokeSynchronisationContainer.ParallelQueues;
                        try
                        {
                            bool localQueueIsEmpty = false;
                            while (!localQueueIsEmpty)
                            {
                                InvokePart invokePart = localparallelQueue.Dequeue();
                                if (invokePart != null)
                                {
                                    foreach (InvokeAction localInvokeAction in invokePart.InvokationParts)
                                    {
                                        localInvokeAction.Invoke();
                                    }
                                }
                                else
                                {
                                    localQueueIsEmpty = true;
                                }
                            }
                            foreach (ParallelQueue <InvokePart> localForegnParallelQueue in localparallelQueues)
                            {
                                if (localForegnParallelQueue != localparallelQueue)
                                {
                                    bool localForegnQueueIsEmpty = false;
                                    while (!localForegnQueueIsEmpty)
                                    {
                                        InvokePart invokePart = localForegnParallelQueue.Steal();
                                        if (invokePart != null)
                                        {
                                            foreach (InvokeAction localInvokeAction in invokePart.InvokationParts)
                                            {
                                                localInvokeAction.Invoke();
                                            }
                                        }
                                        else
                                        {
                                            localForegnQueueIsEmpty = true;
                                        }
                                    }
                                }
                            }
                        }
                        finally
                        {
                            localUnconstantInvokeSynchronisationContainer.ManualResetEvent_.Set();
                        }
                    }, unconstantInvokeSynchronisationContainer);
                    start = end + 1;
                    end   = end + chunk;
                }
                WaitHandle.WaitAll(waitHandles);
            }
        }