Example #1
0
        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);
                }
            }
        }
Example #2
0
        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());
        }