public async Task Go(IProgressReporter reporter, bool throwException) { var boom = new Random().Next(15, 90); try { for (var i = 1; i <= 100; i++) { if (throwException && i == boom) { throw new Exception("SlowFizzBuzz encountered an error."); } if (i % 3 == 0 && i % 5 == 0) { await reporter.UpdateProgress("FIZZBUZZ!!", i, 100); await Task.Delay(1000); } else if (i % 3 == 0) { await reporter.UpdateProgress("FIZZ!", i, 100); await Task.Delay(500); } else if (i % 5 == 0) { await reporter.UpdateProgress("BUZZ!", i, 100); await Task.Delay(500); } else { await reporter.UpdateProgress($"{i} is boring.", i, 100); await Task.Delay(50); } } } finally { // CompleteAdding() must be called or ShowBlockingProgress() will never return. reporter.CompleteAdding(); } }