Form freezes during while loop

前端 未结 3 1962
旧巷少年郎
旧巷少年郎 2021-02-10 12:27

I have a piece of code that checks if a certain application is running

while (Process.GetProcessesByName(\"notepad\").Length == 0)
{
     System.Threading.Thread         


        
相关标签:
3条回答
  • 2021-02-10 13:01

    In this case, you actually want some work done on a thread that's separate from your main UI thread.

    The ideal scenario would be to leverage the BackgroundWorker object, which will happily run on another thread and not block your UI.

    I won't give you a full explanation, as there are plenty of tutorials out there, but you're going to want to do something like:

    var worker = new BackgroundWorker();
    worker.DoWork += new DoWorkEventHandler(worker_DoWork);
    

    This creates the BackgroundWorker and binds its DoWork event to the workerDoWork handler we are about to create:

     void worker_DoWork(object sender, DoWorkEventArgs e)
     {
        //Glorious time-consuming code that no longer blocks!
        while (Process.GetProcessesByName("notepad").Length == 0)
        {
            System.Threading.Thread.Sleep(1000);
        }
     }
    

    Now start the worker:

     worker.RunWorkerAsync();
    

    Check out this tutorial: http://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners

    0 讨论(0)
  • 2021-02-10 13:06

    The form freezes because your code is running on the UI/Main thread.
    So because you are Sleeping the thread while notepad is not open then your form will lock up.
    If you run your code asynchronously then you move the worker thread away from the UI.
    See here for an C# async overview

    0 讨论(0)
  • 2021-02-10 13:09

    You could always just start an asynchronous task to keep updating the UI

    Task f = Task.Factory.StartNew(() =>
            {
                while (true)
                {
                    //This would make the form become responsive every 500 ms
                    Thread.Sleep(500); //Makes the async thread sleep for 500 ms
                    Application.DoEvents(); //Updates the Form's UI
                }
            });
    

    Or this to run it on a different thread

    Task f = Task.Factory.StartNew(() =>
    {
    while (Process.GetProcessesByName("notepad").Length == 0)
        {
            System.Threading.Thread.Sleep(1000); //Does the while loop every 1000 ms
        }
    });
    
    0 讨论(0)
提交回复
热议问题