To say it simply: Each stack of windows is related to single thread. So you might have 2 windows each running on different thread. When you open a new window or dialog, it looks at top of the stack of windows in current thread and uses the top as it's parent. In your case frm.ShowDialog();
opens the dialog in different thread than all other windows so it doesn't have a parent it can to relate to.
To fix this, either use manual invoke (like in How to update the GUI from another thread in C#?) or move opening of the dialog into RunWorkerCompleted
event, that is automatically synchronized to run on main UI thread.