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)); }