In my program I use BackgroundWorker in order to perform some operations in the background. However, a moment has surfaced:
BackgroundWorker worker = new BackgroundWorker(); worker.DoWork += delegate (object sender, DoWorkEventArgs e) { }; worker.RunWorkerCompleted += delegate (object sender, RunWorkerCompletedEventArgs e) { Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId); }; Console.WriteLine(System.Threading.Thread.CurrentThread.ManagedThreadId); worker.RunWorkerAsync(); displays different stream IDs. I assumed that the BackgroundWorker made so that the result of the execution was transferred to the main thread. I am wrong?
From MSDN :
The methods that handle the ProgressChanged and RunWorkerCompleted have access to the application's user interface, as these events are raised on the thread that called the RunWorkerAsync method . However, the DoWork event DoWork cannot work with user interface objects, since it runs in a background thread.
UPD:
System.ComponentModel.BackgroundWorker worker = new System.ComponentModel.BackgroundWorker(); worker.DoWork += delegate (object sender, System.ComponentModel.DoWorkEventArgs e) { Console.WriteLine("DoWork: " + System.Threading.Thread.CurrentThread.ManagedThreadId); (sender as System.ComponentModel.BackgroundWorker).ReportProgress(50, null); }; worker.RunWorkerCompleted += delegate (object sender, System.ComponentModel.RunWorkerCompletedEventArgs e) { Console.WriteLine("RunWorkerCompleted: " + System.Threading.Thread.CurrentThread.ManagedThreadId); }; worker.ProgressChanged += delegate (object sender, System.ComponentModel.ProgressChangedEventArgs e) { Console.WriteLine("ProgressChanged: " + System.Threading.Thread.CurrentThread.ManagedThreadId); }; Console.WriteLine("MainProcess: " + System.Threading.Thread.CurrentThread.ManagedThreadId); worker.WorkerReportsProgress = true; worker.RunWorkerAsync(); gives out:
MainProcess: 9
DoWork: 12
ProgressChanged: 6
RunWorkerCompleted: 12