public void SimpleCountDown()
        {
            var cdl = new CountDownLatch(3);

            cdl.CountDown();
            Assert.AreEqual(2, cdl.Count);

            cdl.CountDown();
            Assert.AreEqual(1, cdl.Count);

            cdl.CountDown();
            Assert.AreEqual(0, cdl.Count);

            cdl.CountDown();
            Assert.AreEqual(0, cdl.Count);
        }
        public void WaitingTask1()
        {
            var cdl = new CountDownLatch(1);
            var task = new Task(cdl);
            var runner = new Thread(task.DoSomething);

            runner.Start();
            Thread.Sleep(600);
            cdl.CountDown();
            runner.Join();

            Assert.IsTrue(task.Elapsed >= 500, "The task should cost more than 500 millis");
            Assert.IsTrue(task.Elapsed <= 700, "The task should cost less than 700 millis");
        }
        public void WaitingTask2()
        {
            CountDownLatch cdl = new CountDownLatch(2);
            Task task = new Task(cdl);
            Thread runner = new Thread(task.DoSomething);

            runner.Start();
            Thread.Sleep(600);
            cdl.CountDown();
            Thread.Sleep(600);
            cdl.CountDown();
            runner.Join();

            Assert.IsTrue(task.Elapsed >= 1100,"The task should cost more than 1100 millis");
            Assert.IsTrue(task.Elapsed <= 1300, "The task should cost less than 1300 millis");
        }