public void LockForReadingWithWriteLocks()
        {
            using (var datasetLock = new DatasetLock())
            {
                Assert.IsFalse(datasetLock.IsLockedForReading);
                Assert.IsFalse(datasetLock.IsLockedForWriting);

                var writeLockEventRaised   = false;
                var writeUnlockEventRaised = false;
                var readLockEventRaised    = false;
                datasetLock.OnLockForWriting    += (s, e) => { writeLockEventRaised = true; };
                datasetLock.OnUnlockFromWriting += (s, e) => { writeUnlockEventRaised = true; };
                datasetLock.OnLockForReading    += (s, e) => { readLockEventRaised = true; };
                var key1 = datasetLock.LockForWriting();

                var task = Task <DatasetLockKey> .Factory.StartNew(datasetLock.LockForReading);

                Assert.IsTrue(writeLockEventRaised);
                Assert.IsFalse(writeUnlockEventRaised);
                Assert.IsFalse(readLockEventRaised);

                var key2 = datasetLock.LockForWriting();
                Assert.IsNotNull(key2);
                Assert.IsTrue(writeLockEventRaised);
                Assert.IsFalse(writeUnlockEventRaised);
                Assert.IsFalse(readLockEventRaised);

                datasetLock.RemoveWriteLock(key1);
                Assert.IsTrue(writeLockEventRaised);
                Assert.IsFalse(writeUnlockEventRaised);
                Assert.IsFalse(readLockEventRaised);

                datasetLock.RemoveWriteLock(key2);
                var key3 = task.Result;

                Assert.IsNotNull(key3);
                Assert.IsTrue(writeLockEventRaised);
                Assert.IsTrue(writeUnlockEventRaised);
                Assert.IsTrue(readLockEventRaised);
            }
        }
        public void LockForReadingWithWriteLocks()
        {
            using (var datasetLock = new DatasetLock())
            {
                Assert.IsFalse(datasetLock.IsLockedForReading);
                Assert.IsFalse(datasetLock.IsLockedForWriting);

                var writeLockEventRaised = false;
                var writeUnlockEventRaised = false;
                var readLockEventRaised = false;
                datasetLock.OnLockForWriting += (s, e) => { writeLockEventRaised = true; };
                datasetLock.OnUnlockFromWriting += (s, e) => { writeUnlockEventRaised = true; };
                datasetLock.OnLockForReading += (s, e) => { readLockEventRaised = true; };
                var key1 = datasetLock.LockForWriting();

                var task = Task<DatasetLockKey>.Factory.StartNew(datasetLock.LockForReading);

                Assert.IsTrue(writeLockEventRaised);
                Assert.IsFalse(writeUnlockEventRaised);
                Assert.IsFalse(readLockEventRaised);

                var key2 = datasetLock.LockForWriting();
                Assert.IsNotNull(key2);
                Assert.IsTrue(writeLockEventRaised);
                Assert.IsFalse(writeUnlockEventRaised);
                Assert.IsFalse(readLockEventRaised);

                datasetLock.RemoveWriteLock(key1);
                Assert.IsTrue(writeLockEventRaised);
                Assert.IsFalse(writeUnlockEventRaised);
                Assert.IsFalse(readLockEventRaised);

                datasetLock.RemoveWriteLock(key2);
                var key3 = task.Result;

                Assert.IsNotNull(key3);
                Assert.IsTrue(writeLockEventRaised);
                Assert.IsTrue(writeUnlockEventRaised);
                Assert.IsTrue(readLockEventRaised);
            }
        }
        public void LockForWritingWithNoLocks()
        {
            using (var datasetLock = new DatasetLock())
            {
                Assert.IsFalse(datasetLock.IsLockedForReading);
                Assert.IsFalse(datasetLock.IsLockedForWriting);

                var eventWasRaised = false;
                datasetLock.OnLockForWriting += (s, e) => { eventWasRaised = true; };
                var key = datasetLock.LockForWriting();

                Assert.IsNotNull(key);
                Assert.IsTrue(eventWasRaised);
                Assert.IsTrue(datasetLock.IsLockedForWriting);
                Assert.IsFalse(datasetLock.IsLockedForReading);
            }
        }
        public void LockForWritingWithNoLocks()
        {
            using (var datasetLock = new DatasetLock())
            {
                Assert.IsFalse(datasetLock.IsLockedForReading);
                Assert.IsFalse(datasetLock.IsLockedForWriting);

                var eventWasRaised = false;
                datasetLock.OnLockForWriting += (s, e) => { eventWasRaised = true; };
                var key = datasetLock.LockForWriting();

                Assert.IsNotNull(key);
                Assert.IsTrue(eventWasRaised);
                Assert.IsTrue(datasetLock.IsLockedForWriting);
                Assert.IsFalse(datasetLock.IsLockedForReading);
            }
        }