public async Task TryTakeTakeTimeoutDispose()
        {               //****************************************
            var MyLock = new AsyncSemaphore(1);

            //****************************************

            Assert.True(MyLock.TryTake(out var MyHandle1), "Lock not taken");

            var MyTask = Task.Run(async() =>
            {
                await Task.Delay(50);

                await MyLock.DisposeAsync();
            });

            Assert.False(MyLock.TryTake(out var MyHandle2, TimeSpan.FromMilliseconds(100)), "Nested lock taken");

            MyHandle1.Dispose();

            await MyTask;

            //****************************************

            Assert.AreEqual(0, MyLock.WaitingCount, "Still waiting for Semaphore");
            Assert.AreEqual(MyLock.MaxCount, MyLock.CurrentCount, "Semaphore still held");
        }
        public void TryTakeTakeZero()
        {               //****************************************
            var MyLock = new AsyncSemaphore();

            //****************************************

            Assert.True(MyLock.TryTake(out var MyHandle1), "Lock not taken");


            Assert.False(MyLock.TryTake(out _, TimeSpan.Zero), "Nested lock taken");

            MyHandle1.Dispose();

            //****************************************

            Assert.AreEqual(0, MyLock.WaitingCount, "Still waiting for Semaphore");
            Assert.AreEqual(MyLock.MaxCount, MyLock.CurrentCount, "Semaphore still held");
        }
        public void TryTakeCancel()
        {               //****************************************
            var MyLock = new AsyncSemaphore();

            //****************************************

            Assert.True(MyLock.TryTake(out var MyHandle1), "Lock not taken");

            using (var MyCancel = new CancellationTokenSource())
            {
                MyCancel.CancelAfter(50);

                var StartTime = DateTime.Now;

                try
                {
                    MyLock.TryTake(out _, MyCancel.Token);

                    Assert.Fail("Nested lock taken");
                }
                catch (OperationCanceledException)
                {
                }

                var EndTime = DateTime.Now;

                Assert.GreaterOrEqual((EndTime - StartTime).TotalMilliseconds, 50.0, "Finished too early");
            }

            MyHandle1.Dispose();

            //****************************************

            Assert.AreEqual(0, MyLock.WaitingCount, "Still waiting for Semaphore");
            Assert.AreEqual(MyLock.MaxCount, MyLock.CurrentCount, "Semaphore still held");
        }
        public void TryTakeMaxTime()
        {               //****************************************
            var MyLock = new AsyncSemaphore();

            //****************************************

            Assert.True(MyLock.TryTake(out var MyHandle1), "Lock not taken");

            var StartTime = DateTime.Now;


            Assert.False(MyLock.TryTake(out _, TimeSpan.FromMilliseconds(50)), "Nested lock taken");

            var EndTime = DateTime.Now;

            MyHandle1.Dispose();

            //****************************************

            Assert.GreaterOrEqual((EndTime - StartTime).TotalMilliseconds, 50.0, "Finished too early");

            Assert.AreEqual(0, MyLock.WaitingCount, "Still waiting for Semaphore");
            Assert.AreEqual(MyLock.MaxCount, MyLock.CurrentCount, "Semaphore still held");
        }