为什么即使进程确实存在,Process.WaitForExit也会抛出“无进程”异常?

时间:2012-02-02 10:18:02

标签: c# .net .net-3.5 windows-server-2003

我有一个包含此代码的Windows服务:

    public static void ExtractTextInner(string source, string destination)
    {   
        ProcessStartInfo startInfo = new ProcessStartInfo();
        startInfo.FileName = EXTRACTOR_EXE_FILEPATH
        startInfo.Arguments = "\"" + source + "\" \"" + destination + "\"";
        startInfo.CreateNoWindow = true;
        startInfo.WindowStyle = ProcessWindowStyle.Hidden;

        Process process = new Process();
        process.StartInfo = startInfo;

        process.Start();
        process.WaitForExit();
        int exitCode = process.ExitCode;
        process.Close();
        if (exitCode != 0)
        {
            switch (exitCode)
            {
                case 1:
                throw new ApplicationException("IFilter Extraction Failed");
                default:
                throw new ApplicationException("Unknown Exit Code:" + exitCode.ToString());
            }
        }
    }

此代码的目的是在文档上运行IFilter提取,我们使用单独的过程,因为一些IFilter是众所周知的片状。

现在,此代码在Windows 7和Server 2008 R2上完全运行,但在Windows Server 2003上,WaitForExit会立即抛出“没有与此Process对象关联的进程”异常。该过程确实存在并且完成其任务没有问题。

有人见过这个吗?任何人都可以解释为什么WaitForExit会出现这个错误吗?

其他信息

如果我将此代码放在控制台应用程序中并运行它也可以在Windws Server 2003框上正常工作,因此它似乎是在Windows Server 2003框中的服务中运行此代码的特定问题。

1 个答案:

答案 0 :(得分:15)

使用System.Diagnostics.Process类启动进程时,系统可以使用CreateProcessShellExecuteEx Win32函数。使用CreateProcess时,只能启动可执行文件。使用ShellExecuteEx时,可以使用shell中的“开始 - >运行”命令启动任何文件。

然而,这些是完全不同的启动过程的方式。 ShellExecuteEx涉及shell,例如,可以使用存储在HKCR\<progid>\shell\<verb>注册表项下的信息,重新使用现有的Word或Excel实例来打开文档。这可能涉及例如使用DDE搜索并激活现有的Excel实例。

请参阅ShellExecuteEx的{​​{1}}上的文档:

请注意,SHELLEXECUTEINFO可能会也可能不会返回hProcess,具体取决于是否启动了新进程。这是你所看到的行为。

ShellExecuteEx是一个低级函数,可直接创建一个进程,只需传递等效参数即可。它总是返回一个进程句柄。

注意:由于您似乎正在启动可执行文件,因此CreateProcess不会返回hProcess,这有点令人惊讶。不过,如果您想确保获得流程处理,使用ShellExecuteEx是正确的做法。