我有一段代码可以检查某个应用程序是否正在运行
while (Process.GetProcessesByName("notepad").Length == 0)
{
System.Threading.Thread.Sleep(1000);
}
它将检查用户是否正在运行记事本,但它会使表单冻结并在几秒钟后停止响应。我不知道是否有更好的解决方案来解决这个问题。
答案 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
}
});