From 1a69e7ed4156d15af0b0d479b1c99aa2358fbfc9 Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Mon, 8 Jun 2020 16:27:36 -0700 Subject: Support async execution of commands --- src/wix/Program.cs | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/src/wix/Program.cs b/src/wix/Program.cs index 3293ef05..3b6c45bc 100644 --- a/src/wix/Program.cs +++ b/src/wix/Program.cs @@ -4,6 +4,8 @@ namespace WixToolset.Tools { using System; using System.Runtime.InteropServices; + using System.Threading; + using System.Threading.Tasks; using WixToolset.Converters; using WixToolset.Core; using WixToolset.Data; @@ -23,17 +25,27 @@ namespace WixToolset.Tools /// Commandline arguments for the application. /// Returns the application error code. [MTAThread] - public static int Main(string[] args) + public static async Task Main(string[] args) { - var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider() - .AddConverter(); - + var cts = new CancellationTokenSource(); var listener = new ConsoleMessageListener("WIX", "wix.exe"); + Console.CancelKeyPress += (s, e) => + { + cts.Cancel(); + e.Cancel = true; + }; + try { - var program = new Program(); - return program.Run(serviceProvider, listener, args); + var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider() + .AddConverter(); + + return await Run(serviceProvider, listener, args, cts.Token); + } + catch (OperationCanceledException) + { + return -1; } catch (WixException e) { @@ -58,9 +70,11 @@ namespace WixToolset.Tools /// Executes the wix command-line interface. /// /// Service provider to use throughout this execution. + /// Listener to use for the messaging system. /// Command-line arguments to execute. + /// Cancellation token. /// Returns the application error code. - public int Run(IWixToolsetServiceProvider serviceProvider, IMessageListener listener, string[] args) + public static Task Run(IWixToolsetServiceProvider serviceProvider, IMessageListener listener, string[] args, CancellationToken cancellationToken) { var messaging = serviceProvider.GetService(); messaging.SetListener(listener); @@ -72,7 +86,7 @@ namespace WixToolset.Tools commandLine.ExtensionManager = CreateExtensionManagerWithStandardBackends(serviceProvider, messaging, arguments.Extensions); commandLine.Arguments = arguments; var command = commandLine.ParseStandardCommandLine(); - return command?.Execute() ?? 1; + return command?.ExecuteAsync(cancellationToken) ?? Task.FromResult(1); } private static IExtensionManager CreateExtensionManagerWithStandardBackends(IWixToolsetServiceProvider serviceProvider, IMessaging messaging, string[] extensions) -- cgit v1.2.3-55-g6feb