I am trying to show a form with a spinner in the middle as a loading screen (not a progress indicator) while doing some long work and finally showing a form with the results, i am letting another thread handle the loading screen but when i use show() it just shows a black window (like its stuck) and sometimes it just flashes the window, while using ShowDialog() works perfectly but it blocks the thread and now i have to use Thread.Abort() and Thread.ResetAbort() to kill the thread, which i think you agree its not a good way to handle this. so my question is why ShowDialog() works but Show() doesn't.
I tried using async and await methods that i found here but it always comes back to ShowDialog(), what am i missing? and is there a safe way to exit the thread here?
public void button1_Click(object sender, EventArgs e)
{
    t1 = new Thread(() =>
    { 
        Loading l = new Loading();        
        l.Show(); //Doesn't work
        l.ShowDialog(); //Works but thread will be blocked  
        while (!ThreadExitFlag) 
        { 
        }
        l.Close();
    });
    t1.Start();
    LongWork(); //this will trigger the ThreadExitFlag by the end        
}