Fields are now protected.
cancel now uses isDone() to determine if task already ran since result
may be null at end of some tasks.