 <p>It is because the callback is being run on a thread.</p> <p>Why?</p> <p>The Console application.</p> <p>According to the <code>Progress</code> class MSDN documentation:</p> <blockquote> <p>Any handler provided to the constructor or event handlers registered with the ProgressChanged event are invoked through a SynchronizationContext instance captured when the instance is constructed. If there is no current SynchronizationContext at the time of construction, the callbacks will be invoked on the ThreadPool.</p> </blockquote> <p>Essentially, your callbacks are out of whack because there is no <code>SynchronizationContext</code> in a Console application.. so they are being fired on ThreadPool threads.</p> <p>Try it in a Windows application.. here's a screenshot of the output for the exact same code:</p> <p><img src="https://i.stack.imgur.com/fjRrA.png" alt="Sync example"></p>