From 9a3fe17b88f26345a2eb04750adfeeedb31bb7e3 Mon Sep 17 00:00:00 2001 From: Matt Parker <61717342+MattParkerDev@users.noreply.github.com> Date: Sun, 3 Aug 2025 00:27:33 +1000 Subject: [PATCH] Add build cancellation --- .../Features/Build/BuildManagerExtensions.cs | 4 +++- src/SharpIDE.Application/Features/Build/BuildService.cs | 4 ++-- src/SharpIDE.Photino/Layout/MainLayout.razor | 8 +++++++- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/src/SharpIDE.Application/Features/Build/BuildManagerExtensions.cs b/src/SharpIDE.Application/Features/Build/BuildManagerExtensions.cs index c9eec93..e935cd9 100644 --- a/src/SharpIDE.Application/Features/Build/BuildManagerExtensions.cs +++ b/src/SharpIDE.Application/Features/Build/BuildManagerExtensions.cs @@ -8,13 +8,15 @@ public static class BuildManagerExtensions /// 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) + public static async Task BuildAsync(this BuildManager buildManager, BuildParameters parameters, BuildRequestData requestData, CancellationToken cancellationToken = default) { BuildResult result; buildManager.BeginBuild(parameters); try { var tcs = new TaskCompletionSource(TaskCreationOptions.RunContinuationsAsynchronously); + await using var cancellationTokenRegistration = cancellationToken.Register(() => buildManager.CancelAllSubmissions()); + cancellationTokenRegistration.ConfigureAwait(false); try { diff --git a/src/SharpIDE.Application/Features/Build/BuildService.cs b/src/SharpIDE.Application/Features/Build/BuildService.cs index 1c91ab1..509067b 100644 --- a/src/SharpIDE.Application/Features/Build/BuildService.cs +++ b/src/SharpIDE.Application/Features/Build/BuildService.cs @@ -18,7 +18,7 @@ public class BuildService { public event Func BuildStarted = () => Task.CompletedTask; public ChannelTextWriter BuildTextWriter { get; } = new ChannelTextWriter(); - public async Task MsBuildSolutionAsync(string solutionFilePath, BuildType buildType = BuildType.Build) + public async Task MsBuildSolutionAsync(string solutionFilePath, BuildType buildType = BuildType.Build, CancellationToken cancellationToken = default) { var normalOut = Console.Out; Console.SetOut(BuildTextWriter); @@ -50,7 +50,7 @@ public class BuildService await BuildStarted.Invoke().ConfigureAwait(false); var timer = Stopwatch.StartNew(); - var buildResult = await BuildManager.DefaultBuildManager.BuildAsync(buildParameters, buildRequest).ConfigureAwait(false); + var buildResult = await BuildManager.DefaultBuildManager.BuildAsync(buildParameters, buildRequest, cancellationToken).ConfigureAwait(false); timer.Stop(); Console.WriteLine($"Build result: {buildResult.OverallResult} in {timer.ElapsedMilliseconds}ms"); } diff --git a/src/SharpIDE.Photino/Layout/MainLayout.razor b/src/SharpIDE.Photino/Layout/MainLayout.razor index bc3ba7d..a09bb43 100644 --- a/src/SharpIDE.Photino/Layout/MainLayout.razor +++ b/src/SharpIDE.Photino/Layout/MainLayout.razor @@ -17,6 +17,9 @@ Clean Restore + + + @@ -88,6 +91,7 @@ } } + private CancellationTokenSource _cancellationTokenSource = null!; private async Task BuildSolution() => await MsBuildSolution(BuildType.Build); private async Task RebuildSolution() => await MsBuildSolution(BuildType.Rebuild); private async Task CleanSolution() => await MsBuildSolution(BuildType.Clean); @@ -95,8 +99,10 @@ private async Task MsBuildSolution(BuildType buildType) { if (AppState.IdeSettings.OpenTerminalOnBuildRebuildRestore) _terminalDrawerOpen = true; - await BuildService.MsBuildSolutionAsync(_solutionFilePath!, buildType); + _cancellationTokenSource = new CancellationTokenSource(); + await BuildService.MsBuildSolutionAsync(_solutionFilePath!, buildType, _cancellationTokenSource.Token); } + private async Task CancelBuild() => await _cancellationTokenSource.CancelAsync(); private async Task OpenSettingsDialog() {