If one uses “BackgroundWorker” class in an application.Then, as per the documentation and the discussion found online. It is suppose to raise “RunWorkerCompleted” and “ProgressChanged” on the same thread. On which the object of “BackgroundWorker” was created. Which in case of Windows form application would be UI Thread.
One of the possible explanation of this behavior can be found here. What it states that only in case of GUI Windows Forms it is suppose to behave that way. Since, BackgroundWorker uses the synchronization model provided by SynchronizationContext.Current to dispatch events.