public void TestAsyncThreeStageWork()
        {
            OnRequestExecutionQuantizer testInst = new OnRequestExecutionQuantizer();
            int stageNum = 0;

            var task = Task.Run(() =>
            {
                Interlocked.Increment(ref stageNum);
                testInst.Tick();
                Interlocked.Increment(ref stageNum);
                testInst.Tick();
                Interlocked.Increment(ref stageNum);
            });


            TimingAssert.AreEqual(5000, 1, () => Volatile.Read(ref stageNum), "StageNum = 1");

            testInst.AllowProcess();
            testInst.WaitForTickers();
            TimingAssert.AreEqual(5000, 2, () => Volatile.Read(ref stageNum), "StageNum = 2");

            testInst.AllowProcess();

            task.Wait();
            Assert.AreEqual(3, stageNum, "stageNum = 3");
        }
        public void TestBasicFunctions()
        {
            OnRequestExecutionQuantizer testInst = new OnRequestExecutionQuantizer();

            Assert.AreEqual(0, testInst.TickWaiters);
            Assert.AreEqual(false, testInst.IsProcessAllowed);

            testInst.AllowProcess();
            Assert.AreEqual(true, testInst.IsProcessAllowed);

            testInst.Tick();

            Assert.AreEqual(0, testInst.TickWaiters);
            Assert.AreEqual(false, testInst.IsProcessAllowed);
        }