如何知道Process.Start()是否成功?

我已经尝试了两种不同的方法来启动一个进程。

首先

定义被定义为Start方法的参数:

System.Diagnostics.Process.Start("excel", string.Format("\"{0}\"", ExcelFileBox.Text.ToString()));

我的想法:

这个开始很好,但我不知道如何从中得到反馈。

第二

我开始研究ProcessStartInfo是因为我想知道Excel是否成功启动 – 例如,虽然它很可能存在于用户的机器上,但是不能保证,并且向用户指示它已启动是愚蠢的没有成功的时候。

 System.Diagnostics.ProcessStartInfo startinfo = new System.Diagnostics.ProcessStartInfo { FileName = "excel", Arguments = string.Format("\"{0}\"", ExcelFileBox.Text.ToString()), ErrorDialog = true, UseShellExecute = false, WorkingDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) }; try { System.Diagnostics.Process.Start(startinfo); } catch (Exception err) { Console.WriteLine(err.Message); } 

我的想法:

这给出了错误:“系统找不到指定的文件”,但不清楚它是指Excel应用程序还是我的文件。 无论如何,虽然我很欣赏错误信息的能力,但我现在不应该接受。

想法,build议,想法如何知道这是否成功?

解决了

我把启动一个进程的第一种方式变成了一个try-catch,它运行的很好。

Process.Start()中的MSDN页面指出,此方法有一个布尔types的重载,其中的返回值表示:

如果进程资源已启动,则为true; 如果没有启动新的进程资源(例如,如果现有进程被重用),则返回false。

另外它可以抛出三个例外:

  • 出现InvalidOperationException

在Process组件的StartInfo中没有指定文件名。

-要么-

StartInfo属性的ProcessStartInfo.UseShellExecute成员为true,而ProcessStartInfo.RedirectStandardInput,ProcessStartInfo.RedirectStandardOutput或ProcessStartInfo.RedirectStandardError为true。

  • Win32Exception

打开相关文件时出错。

  • 的ObjectDisposedException

过程对象已经被处置。


要使用Process.Start()(这是方法的唯一非静态重载)的重载,需要使用ProcessStartInfo对象创buildProcess类的实例。

下面是一个例子:

 ProcessStartInfo processStartInfo = new ProcessStartInfo("EXCEL.EXE"); Process process = new Process(); process.StartInfo = processStartInfo; if (!process.Start()) { // That didn't work } 

虽然,这仍然可以抛出你可能只是围绕一个静态的.Start()方法调用。


鉴于此,对Process.Start()的调用无论是否工作,似乎很清楚,您可以从返回值为0(或引发exception)中确定这一点。

一旦你的过程开始了,你就可以对事物进行很多的控制,例如HasExited这样的Process类的属性可以让你检查过程所处的状态。

简而言之,如果用户的计算机上没有excel,则Process.Start()将引发exception。

您可以检查Process.ExitCode属性为0成功 )值。

Process.Start()也返回一个布尔值,让你知道它是否获得了一个现有的进程,或者是否一个新的进程已经启动。

此外,您可以检查进程的ProcessId以确保它已启动/仍在运行。 就像是:

 bool started = False; Process p = new Process(); p.StartInfo = YourStartInfo; started = p.Start(); try { int procId = p.Id; } catch(InvalidOperationException){ started = False } catch(Exception ex) { started = False }