Exemple #1
0
        /// <inheritdoc />
        public override void SaveRequest(UploadRequest request, bool isCreate)
        {
            // TODO: uncomment, add check to make sure object is the same
            //if (isCreate)
            //{
            try
            {
#if NET35
                _requestsLock.EnterUpgradeableReadLock();
#else
                _requestsLock.AcquireReaderLock(-1);
#endif
                Dictionary <string, UploadRequest> requests;

                if (!_uploadRequests.TryGetValue(request.UploadSessionId, out requests))
                {
                    requests = new Dictionary <string, UploadRequest>();

                    requests[request.UploadRequestId] = request;

#if !NET35
                    // TODO: does this break something?
                    LockCookie cookie = new LockCookie();
#endif

                    try
                    {
#if NET35
                        _requestsLock.EnterWriteLock();
#else
                        cookie = _requestsLock.UpgradeToWriterLock(-1);
#endif

                        _uploadRequests[request.UploadSessionId] = requests;
                    }
                    finally
                    {
#if NET35
                        _requestsLock.ExitWriteLock();
#else
                        _requestsLock.DowngradeFromWriterLock(ref cookie);
#endif
                    }
                }
                else
                {
                    lock (requests)
                        requests[request.UploadRequestId] = request;
                }
            }
            finally
            {
#if NET35
                _requestsLock.ExitUpgradeableReadLock();
#else
                _requestsLock.ReleaseReaderLock();
#endif
            }
            //}
        }
        public void ExitWriteLock(ref ReaderWriterLockCookie cookie, int millisecondsTimeout)
        {
#if NET35_OR_GREATER || NETCOREAPP || NETSTANDARD
            if (!ReaderWriterLock.IsWriteLockHeld)
            {
                return;
            }
            ReaderWriterLock.ExitWriteLock();
            if (cookie.FromRead)
            {
                if (!ReaderWriterLock.TryEnterReadLock(millisecondsTimeout))
                {
                    throw new TimeoutException("恢复读锁超时");
                }
            }
#else
            if (!ReaderWriterLock.IsWriterLockHeld)
            {
                return;
            }
            if (cookie.FromRead)
            {
                ReaderWriterLock.DowngradeFromWriterLock(ref cookie.LockCookie);
                return;
            }
            ReaderWriterLock.ReleaseWriterLock();
#endif
        }
        public void StillInReadLockAfterDowngrading()
        {
            // Setup
            var l = new ReaderWriterLockSlim();

            // Act/Verify
            l.AcquireReaderLock(0);
            Assert.IsTrue(l.IsReaderLockHeld);
            l.UpgradeToWriterLock(0);
            Assert.IsTrue(l.IsWriterLockHeld);
            Assert.IsTrue(l.IsReaderLockHeld);
            l.DowngradeFromWriterLock();
            Assert.IsFalse(l.IsWriterLockHeld);
            Assert.IsTrue(l.IsReaderLockHeld);
            l.ReleaseReaderLock();
            Assert.IsFalse(l.IsReaderLockHeld);
        } // end of function - StillInReadLockAfterDowngrading