System.Diagnostics.Process WaitForExit在超时时不会终止进程

时间:2017-08-22 10:39:52

标签: c#

我从我的c#代码运行7-zip

ProcessStartInfo processStartInfo = new ProcessStartInfo
{
    WindowStyle = ProcessWindowStyle.Hidden,
    FileName = zipFileExePath,
    Arguments = "x \"" + zipPath + "\" -o\"" + extractPath + "\""
};

using (Process process = Process.Start(processStartInfo))
{
    if (process.WaitForExit(timeout))
    {
    }
    else
    {
        s_logger.ErrorFormat("Timeout whilte extracting extracting {0}", zipPath);
    }

    process.Close();
}

现在我看到的情况是,当超时到达时,7-zip中仍存在Task Manager进程。为什么会这样?我把它们都关闭并处理

2 个答案:

答案 0 :(得分:1)

您的问题提到了Process类的三种方法:

这些方法都不会对过程做任何事情,当然也不会杀死它。

WaitForExit是一种观察方法,它会等待并查看进程是否自行终止。超时的重载将返回bool,告诉您方法是否观察到进程终止。如果它没有,它可能仍在运行。

Close和Dispose对正在运行的进程没有任何作用,它只是关闭Process类内部的句柄,它是该类如何保持进程标签的机制问题。

当您完成观察正在运行的过程时,关闭此句柄是个好主意。

但是,如果您希望流程终止,则必须致电Process.Kill

答案 1 :(得分:0)

可能类似以下内容:

ProcessStartInfo processStartInfo = new ProcessStartInfo
{
    WindowStyle = ProcessWindowStyle.Hidden,
    FileName = zipFileExePath,
    Arguments = "x \"" + zipPath + "\" -o\"" + extractPath + "\""
};

using (Process process = Process.Start(processStartInfo))
{
    if (process.WaitForExit(timeout))
    {
        //somecode?
    }
    else
    {
        s_logger.ErrorFormat("Timeout whilte extracting extracting {0}", zipPath);
    }

    process.Kill();
}