Example #1
0
        /// <summary>
        /// Async wrapper for OptionHelper.RunScriptAsync.
        /// </summary>
        protected async Task <int> Execute(ExecutionArgs args, TaskToken task)
        {
            var outputBuilder = new StringBuilder();
            var errorBuilder  = new StringBuilder();
            int?exitcode      = null;
            var terminator    = OptionHelper.RunScriptAsnyc(
                args.startInfo, args.input,
                (output) => {
                outputBuilder.AppendLine(output);
                args.onOutput?.Invoke(output);
            },
                (error) => {
                errorBuilder.AppendLine(error);
                args.onError?.Invoke(error);
            },
                (code) => {
                exitcode = code;
            }
                );

            while (exitcode == null)
            {
                if (task.cancellation.IsCancellationRequested)
                {
                    terminator(true);
                    task.ThrowIfCancellationRequested();
                }
                await Task.Yield();
            }

            // 137 happens for Kill() and 143 for CloseMainWindow(),
            // which means the script has been canceled
            if (!args.silentError && exitcode != 0 && exitcode != 137 && exitcode != 143)
            {
                throw new Exception(string.Format(
                                        "{0}: Failed to execute {1} (code {2}): {3}\nOutput: {4}",
                                        name, Path.GetFileName(args.startInfo.FileName), exitcode,
                                        errorBuilder.ToString(), outputBuilder.ToString()
                                        ));
            }

            return(exitcode.Value);
        }