public void SequencerExecutesTasksInTheOrderOfTheirDispatch() { var rootDispatcher = new DotNetThreadPoolUnitOfExecution(); var sequencer = new Sequencer(rootDispatcher); const int TasksNumber = 100000; var tasksOutput = new List <int>(); using (var dispatchingFinishedEvent = new AutoResetEvent(false)) { // Dispatches tasks to the sequencer for (int i = 0; i < TasksNumber; i++) { int antiClosureSideEffectNumber = i; sequencer.Dispatch(() => tasksOutput.Add(antiClosureSideEffectNumber)); } // Indicates the end of the sequence with a final task sequencer.Dispatch(() => dispatchingFinishedEvent.Set()); // Waits for sequence completion Check.That(dispatchingFinishedEvent.WaitOne(ThreeSecondsMax)).IsTrue(); // Checks that everything was properly processed in sequence for (int k = 0; k < TasksNumber; k++) { Check.That(tasksOutput[k]).IsEqualTo(k); } } }
private void WriterRoutine(Sequencer sequencer, AutoResetEvent readySetMarkEvent, int firstIndex, int lastIndex, List <int> tasksOutput, AutoResetEvent lastTaskEvent) { readySetMarkEvent.WaitOne(ThreeSecondsMax); for (int i = firstIndex; i < lastIndex; i++) { int antiClosureSideEffectNumber = i; sequencer.Dispatch(() => tasksOutput.Add(antiClosureSideEffectNumber)); } // Indicates the end of the sequence with a final task sequencer.Dispatch(() => lastTaskEvent.Set()); }