Showing a loading screen with a spinner on a separate thread while working, ShowDialog works but Show doesn't





.everyoneloves__top-leaderboard:empty,.everyoneloves__mid-leaderboard:empty,.everyoneloves__bot-mid-leaderboard:empty{ height:90px;width:728px;box-sizing:border-box;
}







0















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
}









share|improve this question




















  • 1





    You should not do UI operations outside the UI thread. Maybe this will help you.

    – heap1
    Jan 4 at 11:59











  • To wit, flip things around and do LongWork() in a separate thread while you keep your UI in the main thread.

    – IceGlasses
    Jan 4 at 13:18




















0















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
}









share|improve this question




















  • 1





    You should not do UI operations outside the UI thread. Maybe this will help you.

    – heap1
    Jan 4 at 11:59











  • To wit, flip things around and do LongWork() in a separate thread while you keep your UI in the main thread.

    – IceGlasses
    Jan 4 at 13:18
















0












0








0








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
}









share|improve this question
















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
}






c# multithreading winforms






share|improve this question















share|improve this question













share|improve this question




share|improve this question








edited Jan 4 at 12:10









R Pelzer

696926




696926










asked Jan 4 at 11:53









HMZHMZ

46




46








  • 1





    You should not do UI operations outside the UI thread. Maybe this will help you.

    – heap1
    Jan 4 at 11:59











  • To wit, flip things around and do LongWork() in a separate thread while you keep your UI in the main thread.

    – IceGlasses
    Jan 4 at 13:18
















  • 1





    You should not do UI operations outside the UI thread. Maybe this will help you.

    – heap1
    Jan 4 at 11:59











  • To wit, flip things around and do LongWork() in a separate thread while you keep your UI in the main thread.

    – IceGlasses
    Jan 4 at 13:18










1




1





You should not do UI operations outside the UI thread. Maybe this will help you.

– heap1
Jan 4 at 11:59





You should not do UI operations outside the UI thread. Maybe this will help you.

– heap1
Jan 4 at 11:59













To wit, flip things around and do LongWork() in a separate thread while you keep your UI in the main thread.

– IceGlasses
Jan 4 at 13:18







To wit, flip things around and do LongWork() in a separate thread while you keep your UI in the main thread.

– IceGlasses
Jan 4 at 13:18














1 Answer
1






active

oldest

votes


















0














Finally, this worked for me, I am not sure if this is the right approach but it does the job perfectly. Code:



Thread  t1 = new Thread(() =>
{
Loading l = new Loading();

Thread t2 = new Thread(() => {

while (!ThreadExitFlag)
{

}

l.Invoke(new Action(() => { l.Close(); }));

});
t2.Start();

l.ShowDialog();


});
t1.Start();


LongWork(); //this will trigger the ThreadExitFlag by the end





share|improve this answer
























    Your Answer






    StackExchange.ifUsing("editor", function () {
    StackExchange.using("externalEditor", function () {
    StackExchange.using("snippets", function () {
    StackExchange.snippets.init();
    });
    });
    }, "code-snippets");

    StackExchange.ready(function() {
    var channelOptions = {
    tags: "".split(" "),
    id: "1"
    };
    initTagRenderer("".split(" "), "".split(" "), channelOptions);

    StackExchange.using("externalEditor", function() {
    // Have to fire editor after snippets, if snippets enabled
    if (StackExchange.settings.snippets.snippetsEnabled) {
    StackExchange.using("snippets", function() {
    createEditor();
    });
    }
    else {
    createEditor();
    }
    });

    function createEditor() {
    StackExchange.prepareEditor({
    heartbeatType: 'answer',
    autoActivateHeartbeat: false,
    convertImagesToLinks: true,
    noModals: true,
    showLowRepImageUploadWarning: true,
    reputationToPostImages: 10,
    bindNavPrevention: true,
    postfix: "",
    imageUploader: {
    brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
    contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
    allowUrls: true
    },
    onDemand: true,
    discardSelector: ".discard-answer"
    ,immediatelyShowMarkdownHelp:true
    });


    }
    });














    draft saved

    draft discarded


















    StackExchange.ready(
    function () {
    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54038490%2fshowing-a-loading-screen-with-a-spinner-on-a-separate-thread-while-working-show%23new-answer', 'question_page');
    }
    );

    Post as a guest















    Required, but never shown

























    1 Answer
    1






    active

    oldest

    votes








    1 Answer
    1






    active

    oldest

    votes









    active

    oldest

    votes






    active

    oldest

    votes









    0














    Finally, this worked for me, I am not sure if this is the right approach but it does the job perfectly. Code:



    Thread  t1 = new Thread(() =>
    {
    Loading l = new Loading();

    Thread t2 = new Thread(() => {

    while (!ThreadExitFlag)
    {

    }

    l.Invoke(new Action(() => { l.Close(); }));

    });
    t2.Start();

    l.ShowDialog();


    });
    t1.Start();


    LongWork(); //this will trigger the ThreadExitFlag by the end





    share|improve this answer




























      0














      Finally, this worked for me, I am not sure if this is the right approach but it does the job perfectly. Code:



      Thread  t1 = new Thread(() =>
      {
      Loading l = new Loading();

      Thread t2 = new Thread(() => {

      while (!ThreadExitFlag)
      {

      }

      l.Invoke(new Action(() => { l.Close(); }));

      });
      t2.Start();

      l.ShowDialog();


      });
      t1.Start();


      LongWork(); //this will trigger the ThreadExitFlag by the end





      share|improve this answer


























        0












        0








        0







        Finally, this worked for me, I am not sure if this is the right approach but it does the job perfectly. Code:



        Thread  t1 = new Thread(() =>
        {
        Loading l = new Loading();

        Thread t2 = new Thread(() => {

        while (!ThreadExitFlag)
        {

        }

        l.Invoke(new Action(() => { l.Close(); }));

        });
        t2.Start();

        l.ShowDialog();


        });
        t1.Start();


        LongWork(); //this will trigger the ThreadExitFlag by the end





        share|improve this answer













        Finally, this worked for me, I am not sure if this is the right approach but it does the job perfectly. Code:



        Thread  t1 = new Thread(() =>
        {
        Loading l = new Loading();

        Thread t2 = new Thread(() => {

        while (!ThreadExitFlag)
        {

        }

        l.Invoke(new Action(() => { l.Close(); }));

        });
        t2.Start();

        l.ShowDialog();


        });
        t1.Start();


        LongWork(); //this will trigger the ThreadExitFlag by the end






        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Jan 5 at 0:16









        HMZHMZ

        46




        46
































            draft saved

            draft discarded




















































            Thanks for contributing an answer to Stack Overflow!


            • Please be sure to answer the question. Provide details and share your research!

            But avoid



            • Asking for help, clarification, or responding to other answers.

            • Making statements based on opinion; back them up with references or personal experience.


            To learn more, see our tips on writing great answers.




            draft saved


            draft discarded














            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f54038490%2fshowing-a-loading-screen-with-a-spinner-on-a-separate-thread-while-working-show%23new-answer', 'question_page');
            }
            );

            Post as a guest















            Required, but never shown





















































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown

































            Required, but never shown














            Required, but never shown












            Required, but never shown







            Required, but never shown







            Popular posts from this blog

            Monofisismo

            Angular Downloading a file using contenturl with Basic Authentication

            Olmecas