public Task OpenProjectForWriteAsync(ConfiguredProject project, Action <Project> action, ProjectCheckoutOption option, CancellationToken cancellationToken = default) { action(_evaluationProject); return(Task.CompletedTask); }
public async Task OpenProjectForWriteAsync(ConfiguredProject project, Action <Project> action, ProjectCheckoutOption option = ProjectCheckoutOption.Checkout, CancellationToken cancellationToken = default) { Requires.NotNull(project, nameof(project)); Requires.NotNull(project, nameof(action)); await _projectLockService.WriteLockAsync(async access => { if (option == ProjectCheckoutOption.Checkout) { await access.CheckoutAsync(project.UnconfiguredProject.FullPath); } Project evaluatedProject = await access.GetProjectAsync(project, cancellationToken); // Deliberately not async to reduce the type of // code you can run while holding the lock. action(evaluatedProject); // Avoid blocking thread on Dispose await access.ReleaseAsync(); }, cancellationToken); }