コード例 #1
0
        public async Task <TreeLock> AcquireAsync(CancellationToken cancellationToken, params string[] paths)
        {
            cancellationToken.ThrowIfCancellationRequested();

            SnTrace.ContentOperation.Write("TreeLock: Acquiring lock for {0}", string.Join(", ", paths));

            var lockTasks = paths.Select(p => _dataStore.AcquireTreeLockAsync(p, cancellationToken));
            var lockIds   = await Task.WhenAll(lockTasks).ConfigureAwait(false);

            for (var i = 0; i < lockIds.Length; i++)
            {
                cancellationToken.ThrowIfCancellationRequested();

                if (lockIds[i] == 0)
                {
                    await _dataStore.ReleaseTreeLockAsync(lockIds, cancellationToken).ConfigureAwait(false);

                    var msg = "Cannot acquire a tree lock for " + paths[i];
                    SnTrace.ContentOperation.Write("TreeLock: " + msg);
                    throw new LockedTreeException(msg);
                }
            }

            var logOp = SnTrace.ContentOperation.StartOperation("TreeLock: {0} for {1}", lockIds, paths);

            return(new TreeLock(logOp, _dataStore, lockIds));
        }