CCleaner C3等待退出

时间:2014-02-27 09:15:37

标签: c#

我正在开发一个自动运行一套清洁工具的程序。 但是当我运行CCleaner时,我必须使用thread.sleep,因为process.waitforexit不起作用。

这不太理想,因为有时cclean比我在thread.sleep中设置的时间更长或更短。

我试过只使用32个portalbe版本的CCleaner,但这不起作用。 我不想安装CCleaner,因为我必须在完成后将其删除。

我做错了什么,或者这是一个错误或其他什么。

3 个答案:

答案 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和流程提升的工作原理。一个进程在运行时不能简单地“提升”。它实际上必须在提升状态下生成一个新进程。

因此,我怀疑正在发生的事情是:

  1. 您的代码启动了CCleaner无法提升的流程。
  2. CCleaner注意到它没有提升但需要提升,并开始提升自己的副本。
  3. 未升级的流程退出,使升级版本继续运行。
  4. 您的代码的WaitForExit()来电返回。

  5. 我认为有两种方法可以解决这个问题:

    1. 只需启动第一个提升的CCleaner进程,就可以按预期工作。
    2. 获取您启动的进程的PID以及WaitForExit返回的时间,检查正在运行的进程以确保没有子进程(ParentPID等于原始进程的ID的进程)仍在运行。如果是这样,请等到这些退出。

      注意我并非100%确定这会起作用,这取决于CCleaner如何启动升级过程。它可能是一个单独的进程而不是子进程,在这种情况下,您必须检查任何“CCleaner”进程的进程列表并等待这些进程退出。当然,如果用户在您的工具运行时手动启动一个,这将会挂起。