public void TestBelateDispose()
        {
            Semaphore s = new Semaphore(0, 100);
            // Create object
            MyDisposable disp = new MyDisposable();
            // Belate dispose, this handle is passed to the task
            IDisposable belateHandle = disp.BelateDispose();

            // Start work
            Task.Run(() =>
            {
                // Do work
                Thread.Sleep(1000);
                //
                Assert.IsFalse(disp.IsDisposing);
                Assert.IsTrue(disp.IsDisposeCalled);
                // Release belate handle
                belateHandle.Dispose();
                // Check is disposed
                Assert.IsTrue(disp.IsDisposed);
                //
                s.Release();
            });
            // Start dispose, which is postponed
            disp.Dispose();
            // Check is disposed
            Assert.IsTrue(disp.IsDisposeCalled);
            Assert.IsFalse(disp.IsDisposed);
            Assert.IsFalse(disp.IsDisposing);

            // The test exists before the thread
            s.WaitOne();
            Assert.IsTrue(disp.IsDisposeCalled);
            Assert.IsTrue(disp.IsDisposing);
            Assert.IsTrue(disp.IsDisposed);
        }