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); }); } } }
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; } } } } }
public QueueGroup(AbstractQueueGroupKey queueGroupKey, IList queue) { this.QueueGroupKey = queueGroupKey; this.Queue = queue; ExecutionTime = DateTime.Now + TimeSpan.FromMilliseconds(queueGroupKey.QueueInterval); }