Support async execution of commands
Rob Mensching committed
Jun 8, 2020 at 16:27 UTC
1a69e7ed4156d15af0b0d479b1c99aa2358fbfc9
1 file changed
+22
-8
src/wix/Program.cs
+22
-8
@@ -4,6 +4,8 @@ namespace WixToolset.Tools
4
{
5
using System;
6
using System.Runtime.InteropServices;
7
+ using System.Threading;
8
+ using System.Threading.Tasks;
9
using WixToolset.Converters;
10
using WixToolset.Core;
11
using WixToolset.Data;
@@ -23,17 +25,27 @@ namespace WixToolset.Tools
25
/// <param name="args">Commandline arguments for the application.</param>
26
/// <returns>Returns the application error code.</returns>
27
[MTAThread]
26
- public static int Main(string[] args)
28
+ public static async Task<int> Main(string[] args)
29
{
28
- var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider()
29
- .AddConverter();
30
-
30
+ var cts = new CancellationTokenSource();
31
var listener = new ConsoleMessageListener("WIX", "wix.exe");
32
33
+ Console.CancelKeyPress += (s, e) =>
34
+ {
35
+ cts.Cancel();
36
+ e.Cancel = true;
37
+ };
38
+
39
try
40
{
35
- var program = new Program();
36
- return program.Run(serviceProvider, listener, args);
41
+ var serviceProvider = WixToolsetServiceProviderFactory.CreateServiceProvider()
42
+ .AddConverter();
43
+
44
+ return await Run(serviceProvider, listener, args, cts.Token);
45
+ }
46
+ catch (OperationCanceledException)
47
+ {
48
+ return -1;
49
}
50
catch (WixException e)
51
{
@@ -58,9 +70,11 @@ namespace WixToolset.Tools
70
/// Executes the wix command-line interface.
71
/// </summary>
72
/// <param name="serviceProvider">Service provider to use throughout this execution.</param>
73
+ /// <param name="listener">Listener to use for the messaging system.</param>
74
/// <param name="args">Command-line arguments to execute.</param>
75
+ /// <param name="cancellationToken">Cancellation token.</param>
76
/// <returns>Returns the application error code.</returns>
63
- public int Run(IWixToolsetServiceProvider serviceProvider, IMessageListener listener, string[] args)
77
+ public static Task<int> Run(IWixToolsetServiceProvider serviceProvider, IMessageListener listener, string[] args, CancellationToken cancellationToken)
78
{
79
var messaging = serviceProvider.GetService<IMessaging>();
80
messaging.SetListener(listener);
@@ -72,7 +86,7 @@ namespace WixToolset.Tools
86
commandLine.ExtensionManager = CreateExtensionManagerWithStandardBackends(serviceProvider, messaging, arguments.Extensions);
87
commandLine.Arguments = arguments;
88
var command = commandLine.ParseStandardCommandLine();
75
- return command?.Execute() ?? 1;
89
+ return command?.ExecuteAsync(cancellationToken) ?? Task.FromResult(1);
90
}
91
92
private static IExtensionManager CreateExtensionManagerWithStandardBackends(IWixToolsetServiceProvider serviceProvider, IMessaging messaging, string[] extensions)