If one group repeatedly fails it is possible to starve the other groups from running. Instead of retrying in a loop, set the retry delay and last failure time on the GroupedTasks object and just compare against that when the timer is fired.
This has the added benefit of allowing the groups to continue to batch between failures