Cómo monitorear un programa de larga ejecución mediante programación

Lo que tengo actualmente se puede resumir con este pseudocódigo: public static void Main(string[] args) { var listOfObjects = Database.GetObjectsToUploadToOnlineService(); Parallel.ForEach(Upload) } private static void Upload(MyUploadObject obj) { //Build object (takes a few milliseconds)...