public Task <TOutput> InvokeAsync(TParameters parameters, IProgress <OperationProgress> progress, CancellationToken cancellationToken)
        {
            Verify.Argument.IsNotNull(parameters, "parameters");

            var command        = CreateCommand(parameters);
            var parser         = CreateParser();
            var stdOutReceiver = new AsyncTextParser(parser);
            var stdErrReceiver = new AsyncTextReader();

            return(_commandExecutor
                   .ExecuteCommandAsync(
                       command, stdOutReceiver, stdErrReceiver, GetExecutionFlags(), cancellationToken)
                   .ContinueWith(task =>
            {
                int exitCode = TaskUtility.UnwrapResult(task);
                if (exitCode != 0)
                {
                    HandleNonZeroExitCode(stdErrReceiver, exitCode);
                }
                return parser.GetResult();
            },
                                 cancellationToken,
                                 TaskContinuationOptions.ExecuteSynchronously,
                                 TaskScheduler.Default));
        }
        public TOutput Invoke(TParameters parameters)
        {
            Verify.Argument.IsNotNull(parameters, "parameters");

            var command        = CreateCommand(parameters);
            var parser         = CreateParser();
            var stdOutReceiver = new AsyncTextParser(parser);
            var stdErrReceiver = new AsyncTextReader();
            var exitCode       = _commandExecutor.ExecuteCommand(
                command, stdOutReceiver, stdErrReceiver, GetExecutionFlags());

            if (exitCode != 0)
            {
                HandleNonZeroExitCode(stdErrReceiver, exitCode);
            }
            return(parser.GetResult());
        }
        public async Task <TOutput> InvokeAsync(TParameters parameters, IProgress <OperationProgress> progress, CancellationToken cancellationToken)
        {
            Verify.Argument.IsNotNull(parameters, nameof(parameters));

            var command        = CreateCommand(parameters);
            var parser         = CreateParser();
            var stdOutReceiver = new AsyncTextParser(parser);
            var stdErrReceiver = new AsyncTextReader();

            var processExitCode = await _commandExecutor
                                  .ExecuteCommandAsync(command, stdOutReceiver, stdErrReceiver, GetExecutionFlags(), cancellationToken)
                                  .ConfigureAwait(continueOnCapturedContext: false);

            if (processExitCode != 0)
            {
                HandleNonZeroExitCode(stdErrReceiver, processExitCode);
            }
            return(parser.GetResult());
        }