// Get the next TransportCommand, process it, and pass it on the next route. // If a command was processed, it returns the TransportCommand that was processed, and its TResult public async Task <Option <Tuple <TransportCommand <TCmd, TMetadata, TRoute>, TResult> > > Run() { Option <TransportCommand <TCmd, TMetadata, TRoute> > sqsCommand = await _commandSource.GetNextTransportCommand(); Option <TResult> result = await sqsCommand.MapAsync(ProcessCommand); await sqsCommand.MapAsync(_commandSource.AckTransportCommand); return(from c in sqsCommand from r in result select Tuple.Create(c, r)); }