Exemple #1
0
        public static async Task ExclusiveLock()
        {
            using (var syncRoot = new AsyncExclusiveLock())
                using (var @lock = AsyncLock.Exclusive(syncRoot))
                {
                    var holder = await @lock.TryAcquire(CancellationToken.None);

                    if (holder)
                    {
                    }
                    else
                    {
                        throw new Exception();
                    }
                    True(syncRoot.IsLockHeld);
                    holder.Dispose();
                    False(syncRoot.IsLockHeld);

                    holder = await @lock.Acquire(CancellationToken.None);

                    True(syncRoot.IsLockHeld);
                    holder.Dispose();
                    False(syncRoot.IsLockHeld);
                }
        }
        private static AsyncLock GetExclusiveLock <T>(this T obj)
            where T : class
        {
            AsyncLock @lock;

            switch (obj)
            {
            case null:
                throw new ArgumentNullException(nameof(obj));

            case AsyncExclusiveLock exclusive:
                @lock = AsyncLock.Exclusive(exclusive);
                break;

            case SemaphoreSlim semaphore:
                @lock = AsyncLock.Semaphore(semaphore);
                break;

            case AsyncReaderWriterLock rwl:
                @lock = AsyncLock.WriteLock(rwl);
                break;

            case ReaderWriterLockSlim _:
            case WaitHandle _:
            case ReaderWriterLock _:
                throw new ArgumentException(ExceptionMessages.UnsupportedLockAcquisition, nameof(obj));

            default:
                @lock = AsyncLock.Exclusive(obj.GetUserData()
                                            .GetOrSet(ExclusiveLock, () => new AsyncExclusiveLock()));
                break;
            }

            return(@lock);
        }
Exemple #3
0
        public static void DisposedState()
        {
            var l = AsyncLock.Exclusive();

            l.Dispose();
            var result = l.TryAcquireAsync(CancellationToken.None).SuppressDisposedState();

            True(result.IsCompletedSuccessfully);
            False(result.Result);
        }
        private static AsyncLock GetExclusiveLock <T>(this T obj)
            where T : class
        {
            AsyncLock @lock;

            switch (obj)
            {
            case null:
                throw new ArgumentNullException(nameof(obj));

            case AsyncSharedLock shared:
                @lock = AsyncLock.Exclusive(shared);
                break;

            case AsyncExclusiveLock exclusive:
                @lock = AsyncLock.Exclusive(exclusive);
                break;

            case SemaphoreSlim semaphore:
                @lock = AsyncLock.Semaphore(semaphore);
                break;

            case AsyncReaderWriterLock rwl:
                @lock = AsyncLock.WriteLock(rwl);
                break;

            case ReaderWriterLockSlim _:
            case WaitHandle _:
            case ReaderWriterLock _:
            case string str when !(string.IsInterned(str) is null):
                throw new InvalidOperationException(ExceptionMessages.UnsupportedLockAcquisition);

            default:
                @lock = AsyncLock.Exclusive(obj.GetUserData().GetOrSet(ExclusiveLock));
                break;
            }

            return(@lock);
        }