protected override Result <(Price[], Position[])> GetInputs() { var pricesAsync = ResultEx.TryCatchAsync(GetInputPrices); var positionsAsync = ResultEx.TryCatchAsync(GetInputPositions); var(pricesResult, positionsResult) = TaskEx.WhenAll(pricesAsync, positionsAsync).Result; switch (pricesResult) { case Success <Price[]> successPrice when positionsResult is Success <Position[]> positionsSuccess: return(new Success <(Price[], Position[])>((successPrice.Value, positionsSuccess.Value))); // :( it's all about failures case Failure <Price[]> priceFailure when positionsResult is Failure <Position[]> positionFailure: return(new Failure <(Price[], Position[])>(priceFailure.Reason + " " + positionFailure.Reason)); case Failure <Price[]> failure: return(new Failure <(Price[], Position[])>(failure.Reason)); case Success <Price[]> _ when positionsResult is Failure <Position[]> failure: return(new Failure <(Price[], Position[])>(failure.Reason)); } return(new Failure <(Price[], Position[])>("ParallelAppFlow.GetInputs - Fatal error.")); }