A background task needs to communicate it's finished downloading a file. We often turn to traditional communication methods such as Interfaces or directly calling an object’s function. These methods increase coupling between components and make unit testing more difficult.