我正在开发一个自动运行一套清洁工具的程序。 但是当我运行CCleaner时,我必须使用thread.sleep,因为process.waitforexit不起作用。
这不太理想,因为有时cclean比我在thread.sleep中设置的时间更长或更短。
我试过只使用32个portalbe版本的CCleaner,但这不起作用。 我不想安装CCleaner,因为我必须在完成后将其删除。
我做错了什么,或者这是一个错误或其他什么。
答案 0 :(得分:0)
您可以检查进程是否仍然存在并执行while循环
答案 1 :(得分:0)
试试这个:
Process process = new Process();
process.StartInfo.FileName = "ccleaner.exe";
process.EnableRaisingEvents = true;
process.Exited += (sender, e) => {
// Do whatever you want when it exited
};
process.Start();
这是异步等待进程退出。您需要EnableRaisingEvents = true或永远不会引发退出。
您还可以使用真正命名的事件处理程序而不是匿名委托(我个人更喜欢):
private void IHazAProcess()
{
Process process = new Process();
process.StartInfo.FileName = "ccleaner.exe";
process.EnableRaisingEvents = true;
process.Exited += process_Exited;
process.Start();
}
private void process_Exited(object sender, EventArgs e) {
// Do whatever you want when it exited
}
答案 2 :(得分:0)
从评论中看,过程在UAC提示后返回完成。这是因为UAC和流程提升的工作原理。一个进程在运行时不能简单地“提升”。它实际上必须在提升状态下生成一个新进程。
因此,我怀疑正在发生的事情是:
WaitForExit()
来电返回。我认为有两种方法可以解决这个问题:
获取您启动的进程的PID以及WaitForExit
返回的时间,检查正在运行的进程以确保没有子进程(ParentPID等于原始进程的ID的进程)仍在运行。如果是这样,请等到这些退出。
注意我并非100%确定这会起作用,这取决于CCleaner如何启动升级过程。它可能是一个单独的进程而不是子进程,在这种情况下,您必须检查任何“CCleaner”进程的进程列表并等待这些进程退出。当然,如果用户在您的工具运行时手动启动一个,这将会挂起。