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()
{