diff --git a/src/SharpIDE.Application/Features/Build/BuildManagerExtensions.cs b/src/SharpIDE.Application/Features/Build/BuildManagerExtensions.cs index 9f17e4f..c9eec93 100644 --- a/src/SharpIDE.Application/Features/Build/BuildManagerExtensions.cs +++ b/src/SharpIDE.Application/Features/Build/BuildManagerExtensions.cs @@ -4,17 +4,39 @@ namespace SharpIDE.Application.Features.Build; public static class BuildManagerExtensions { - public static async Task BuildAsync(this BuildManager buildManager, BuildParameters buildParameters, BuildRequestData buildRequest) + /// + /// Convenience method. Submits a lone build request and returns a Task that will complete when results are available. + /// + /// Thrown if a build is already in progress. + public static async Task BuildAsync(this BuildManager buildManager, BuildParameters parameters, BuildRequestData requestData) { - var buildCompleteTcs = new TaskCompletionSource(); - buildManager.BeginBuild(buildParameters); - var buildSubmission = buildManager.PendBuildRequest(buildRequest); - buildSubmission.ExecuteAsync(submission => + BuildResult result; + buildManager.BeginBuild(parameters); + try { - buildCompleteTcs.SetResult(submission.BuildResult!); - }, null); - var buildResult = await buildCompleteTcs.Task.ConfigureAwait(false); - buildManager.EndBuild(); - return buildResult; + var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + + try + { + var buildSubmission = buildManager.PendBuildRequest(requestData); + buildSubmission.ExecuteAsync(sub => + { + var buildResult = sub.BuildResult!; + + tcs.SetResult(buildResult); + }, null); + } + catch (Exception ex) + { + tcs.SetException(ex); + } + + result = await tcs.Task.ConfigureAwait(false); + } + finally + { + buildManager.EndBuild(); + } + return result; } }