表格在while循环期间冻结

Kev*_*hts 3 c# forms while-loop

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

while (Process.GetProcessesByName("notepad").Length == 0)
{
     System.Threading.Thread.Sleep(1000);
}
Run Code Online (Sandbox Code Playgroud)

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

Mis*_*pic 8

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

理想的情况是利用该BackgroundWorker对象,该对象将很乐意在另一个线程上运行而不会阻止您的UI.

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

var worker = new BackgroundWorker();
worker.DoWork += new DoWorkEventHandler(worker_DoWork);
Run Code Online (Sandbox Code Playgroud)

这会创建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);
    }
 }
Run Code Online (Sandbox Code Playgroud)

现在启动工人:

 worker.RunWorkerAsync();
Run Code Online (Sandbox Code Playgroud)

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

  • @badkip - Windows是事件驱动的,你的程序也应该以这种方式工作.不要"等待"发生某些事情,对状态变化做出反应. (2认同)