public ScenarioStepReturnBase MethodInvoke <TScenario>(
                TScenario scenario,
                MethodInfo methodInfo,
                TimeSpan timeout,
                params object[] parameters)
            {
                ScenarioStepReturnBase result = null;

                try
                {
                    var task = Invoke <TScenario>(scenario, methodInfo, parameters);

                    if (timeout != TimeSpan.Zero && task.Wait(timeout: timeout) == false)
                    {
                        try
                        {
                            task.Dispose();
                        }
                        catch (Exception)
                        {
                            throw new AScenarioStepTimeoutException();
                        }
                    }
                    result = task.Result;
                }
                catch (Exception exception)
                {
                    throw exception.InnerException ?? exception;
                }


                return(result);
            }
        private async Task <ScenarioStepReturnResultBundle> RunScenarioStep <TScenario>(
            TScenario scenario,
            MethodInfo method,
            TimeSpan timeout,
            object[] previousParameters,
            ABusinessStepScenarioAttribute businessStepScenario)
        {
            ScenarioStepReturnBase scenarioStepResult = null;

            try
            {
                _logger.Information(string.Format("[{0}] Step was started.", businessStepScenario.Description));
                //await Task.Yield();
                await Task.Run(() =>
                {
                    scenarioStepResult = _methodInvoker.MethodInvoke(scenario, method, timeout, previousParameters);
                });
            }
            catch (AScenarioStepTimeoutException timeoutException)
            {
                _logger.Error(string.Format("[{0}] Step was finished usuccessfully due to timeout.", businessStepScenario.Description));
                {
                    var scenarioResult = new ScenarioResult(isSuccessful: false, numberScenarioStepInvoked: 1, exceptions: timeoutException);
                    return(new ScenarioStepReturnResultBundle(new ScenarioStepReturnVoid(), scenarioResult));
                }
            }

            catch (Exception exception)
            {
                _logger.Error(string.Format("[{0}] Step was finished usuccessfully due to the following exception [{1}].", businessStepScenario.Description, exception));

                {
                    var scenarioResult = new ScenarioResult(isSuccessful: false, numberScenarioStepInvoked: 1, exceptions: exception);
                    return(new ScenarioStepReturnResultBundle(new ScenarioStepReturnVoid(), scenarioResult));
                }
            }

            _logger.Information(string.Format("[{0}] Step was finished successfully.", businessStepScenario.Description));

            return(new ScenarioStepReturnResultBundle(scenarioStepResult, new EmptyScenarioResult(numberScenarioStepInvoked: 1)));
        }
            private async Task <ScenarioStepReturnBase> Invoke <TScenario>(
                TScenario scenario,
                MethodInfo method,
                params object[] parameters)
            {
                ScenarioStepReturnBase methodResult = null;

                var task = Task.Run(() =>
                {
                    try
                    {
                        methodResult = method.Invoke(scenario, parameters: parameters) as ScenarioStepReturnBase;
                    }
                    catch (Exception exception)
                    {
                        throw exception.InnerException;
                    }
                });

                await task;

                return(methodResult ?? new ScenarioStepReturnVoid());
            }
            //--------------------------------------------------------------------------------------------------------------------------------------
            //--------------------------------------------------------------------------------------------------------------------------------------

            public ScenarioStepReturnResultBundle(ScenarioStepReturnBase scenarioSStepReturn, ScenarioResult scenarioResult)
            {
                _scenarioSStepReturn = scenarioSStepReturn;
                _scenarioResult      = scenarioResult;
            }