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

emr*_*ins 24 .net c# excel process

我尝试了两种不同的方法来启动一个过程.

首先

该定义被定义为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);
            }
Run Code Online (Sandbox Code Playgroud)

我的想法:

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

关于如何成功发现的想法,建议和想法?

解决了

我把启动流程的第一种方法放到了try-catch中,它的工作非常精彩.

Dav*_*all 19

Process.Start()上的MSDN页面声明此方法具有Boolean类型的重载,其中返回值表示:

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

此外,它可以抛出三个例外:

  • 出现InvalidOperationException

Process组件的StartInfo中未指定文件名.

-要么-

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

  • Win32Exception

打开关联文件时出错.

  • 的ObjectDisposedException

过程对象已经被处理掉了.


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

下面是一个例子:

ProcessStartInfo processStartInfo = new ProcessStartInfo("EXCEL.EXE");

Process process = new Process();
process.StartInfo = processStartInfo;
if (!process.Start())
{
    // That didn't work
}
Run Code Online (Sandbox Code Playgroud)

虽然,鉴于这仍然可以抛出你可能更好的只是围绕一个静态.Start()方法调用包裹一个catch.


鉴于此,似乎很清楚对Process.Start()的调用是否有效,您可以从返回值为0(或抛出异常)中确定这一点.

一旦您的进程启动,您就可以对事物进行大量控制,使用Process类的属性(例如HasExited)可以检查进程的状态.

简而言之 - 如果用户在他们的机器上没有excel,Process.Start()将抛出异常.

  • 依赖 Process.start() 显然并不总是有效,因为该进程可能已经启动,而您的 Process 对象只是重新使用现有进程,这将返回 false。针对 Win32 异常的 try-catch 绝对是解决您的特定场景的方法。 (2认同)

Mar*_*ade 5

您可以检查Process.ExitCode属性的0(成功)值.


Tre*_*ell 5

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
}
Run Code Online (Sandbox Code Playgroud)