This code snippet is from Stephen Cleary\'s blog and gives an example of how to report progress when using Task.Run. I would like to know why there are no cross thread issue
Progress catches the current SynchronisationContext when it is instantiated. Whenever you call Report, it secretly delegates that to the captured context. In the example, the captured context is the UI, meaning that no exceptions occur.