Ejemplo n.º 1
0
        private void CheckForPendingQueues()
        {
            lock (queueGroupKeyToExecutionTimeDict)
            {
                DateTime now = DateTime.Now;
                for (int a = pendingQueueGroups.Count; a-- > 0;)
                {
                    // Look at the last QueueGroup
                    QueueGroup queueGroup = pendingQueueGroups[a];
                    if (now < queueGroup.ExecutionTime)
                    {
                        // If the next QueueGroup is not ready, the others won't be, too
                        break;
                    }
                    pendingQueueGroups.RemoveAt(a);
                    AbstractQueueGroupKey queueGroupKey = queueGroup.QueueGroupKey;
                    queueGroupKeyToExecutionTimeDict.Remove(queueGroupKey);

                    lock (queueGroupKeyToExecuteDict)
                    {
                        IList <QueueGroup> currentExecutedQueueGroups = DictionaryExtension.ValueOrDefault(queueGroupKeyToExecuteDict, queueGroupKey);
                        if (currentExecutedQueueGroups != null)
                        {
                            // There is already a thread executing the key. Nothing to do here
                            currentExecutedQueueGroups.Add(queueGroup);
                            return;
                        }
                        // List container for concurrent QueueGroup of the same key
                        currentExecutedQueueGroups = new List <QueueGroup>();
                        queueGroupKeyToExecuteDict[queueGroupKey] = currentExecutedQueueGroups;
                    }
                    if (queueGroup.QueueGroupKey.InvokeFromGuiThread && SyncContext != null)
                    {
                        SyncContext.Post(ExecuteQueuedDelegate, queueGroup);
                        continue;
                    }
                    Queue(delegate()
                    {
                        ExecuteQueuedDelegate(queueGroup);
                    });
                }
            }
        }
Ejemplo n.º 2
0
        private void ExecuteQueuedDelegate(Object state)
        {
            QueueGroup            queueGroup    = (QueueGroup)state;
            AbstractQueueGroupKey queueGroupKey = queueGroup.QueueGroupKey;

            bool doRun = true;

            while (doRun)
            {
                try
                {
                    if (queueGroupKey is QueueGroupKey)
                    {
                        ((QueueGroupKey)queueGroupKey).QueuedDelegate.Invoke();
                    }
                    else
                    {
                        Delegate delegateObj = (Delegate)queueGroupKey.GetType().GetProperty("QueuedDelegate").GetValue(queueGroupKey, null);
                        delegateObj.DynamicInvoke(queueGroup.Queue);
                    }
                }
                finally
                {
                    lock (queueGroupKeyToExecuteDict)
                    {
                        IList <QueueGroup> currentExecutedQueueGroups = DictionaryExtension.ValueOrDefault(queueGroupKeyToExecuteDict, queueGroupKey);
                        if (currentExecutedQueueGroups.Count > 0)
                        {
                            // There is another queueGroup of the same key ready to be executed. Do it now immediately
                            queueGroup    = currentExecutedQueueGroups[0];
                            queueGroupKey = queueGroup.QueueGroupKey;
                            currentExecutedQueueGroups.RemoveAt(0);
                        }
                        else
                        {
                            queueGroupKeyToExecuteDict.Remove(queueGroupKey);
                            doRun = false;
                        }
                    }
                }
            }
        }
Ejemplo n.º 3
0
 public QueueGroup(AbstractQueueGroupKey queueGroupKey, IList queue)
 {
     this.QueueGroupKey = queueGroupKey;
     this.Queue         = queue;
     ExecutionTime      = DateTime.Now + TimeSpan.FromMilliseconds(queueGroupKey.QueueInterval);
 }