private static IteratorContext ExecuteTaskHelper(ITask currentTask) { if (currentTask.LinkedIterator != null) { IteratorContext iteratorContext = (IteratorContext)currentTask.LinkedIterator; if (CausalityThreadContext.IsEmpty(iteratorContext._causalities)) { Dispatcher.ClearCausalities(); } else { Dispatcher.SetCurrentThreadCausalities(iteratorContext._causalities.Clone()); } } else { Dispatcher.TransferCausalitiesFromTaskToCurrentThread(currentTask); } if (Debugger.IsAttached) { CausalityThreadContext currentThreadCausalities = Dispatcher.GetCurrentThreadCausalities(); if (!CausalityThreadContext.IsEmpty(currentThreadCausalities) && CausalityThreadContext.RequiresDebugBreak(currentThreadCausalities)) { Debugger.Break(); } } IEnumerator <ITask> enumerator = currentTask.Execute(); if (enumerator != null) { return(new IteratorContext(enumerator, Dispatcher.GetCurrentThreadCausalities())); } return(null); }
private void SignalTimer(DispatcherQueue.TimerContext tc) { try { Dispatcher.SetCurrentThreadCausalities(tc.CausalityContext); tc.TimerPort.Post(DateTime.Now); Dispatcher.ClearCausalities(); } catch (Exception exception) { Dispatcher.LogError("DispatcherQueue:TimerHandler", exception); } }
internal void ExecutionLoop() { CheckStartupComplete(); while (true) { IL_06: int num = 0; int num2 = 0; ITask currentTask = null; try { bool flag = false; while (true) { if (num == 0) { if (_thread == null) { break; } WaitForTask(flag); } num2++; num = 0; int cachedDispatcherQueueCount = _dispatcher._cachedDispatcherQueueCount; for (int i = 0; i < cachedDispatcherQueueCount; i++) { if (cachedDispatcherQueueCount != _dispatcher._cachedDispatcherQueueCount) { goto Block_5; } DispatcherQueue dispatcherQueue; try { dispatcherQueue = _dispatcher._dispatcherQueues[(i + num2) % cachedDispatcherQueueCount]; } catch { goto IL_06; } if (_isFastTimerLogicEnabled) { flag |= dispatcherQueue.CheckTimerExpirations(); } if (dispatcherQueue.TryDequeue(out currentTask)) { num += dispatcherQueue.Count; TaskExecutionWorker.ExecuteTask(ref currentTask, dispatcherQueue, false); } } } Dispatcher.ClearCausalities(); CheckShutdownComplete(); Dispatcher.ClearCausalities(); break; Block_5: continue; } catch (Exception ex) { if (TaskExecutionWorker.IsCriticalException(ex)) { throw; } TaskExecutionWorker.HandleException(currentTask, ex); continue; } } }