表格在while循环期间冻结

时间:2013-12-28 15:25:15

标签: c# forms while-loop

我有一段代码可以检查某个应用程序是否正在运行

while (Process.GetProcessesByName("notepad").Length == 0)
{
     System.Threading.Thread.Sleep(1000);
}

它将检查用户是否正在运行记事本,但它会使表单冻结并在几秒钟后停止响应。我不知道是否有更好的解决方案来解决这个问题。

3 个答案:

答案 0 :(得分:8)

在这种情况下,您实际上希望在与主UI线程分开的线程上完成一些工作。

理想的情况是利用BackgroundWorker对象,它将很乐意在另一个线程上运行而不会阻止你的用户界面。

我不会给你一个完整的解释,因为那里有很多教程,但你会想要做一些事情:

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

这会创建BackgroundWorker并将其DoWork事件绑定到我们即将创建的workerDoWork处理程序:

 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);
    }
 }

现在开始工作:

 worker.RunWorkerAsync();

查看本教程:http://www.codeproject.com/Articles/99143/BackgroundWorker-Class-Sample-for-Beginners

答案 1 :(得分:3)

由于您的代码在UI /主线程上运行,因此表单会冻结 因此,当记事本未打开时,您正在睡觉线程,那么您的表格将被锁定 如果以异步方式运行代码,则将工作线程从UI移开 请参阅此处查看C# async overview

答案 2 :(得分:0)

您可以随时启动异步任务以继续更新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
            }
        });

或者这是在另一个线程上运行它

Task f = Task.Factory.StartNew(() =>
{
while (Process.GetProcessesByName("notepad").Length == 0)
    {
        System.Threading.Thread.Sleep(1000); //Does the while loop every 1000 ms
    }
});