【问题标题】:How to know if Process.Start() is successful?如何知道 Process.Start() 是否成功?
【发布时间】:2011-08-10 16:12:08
【问题描述】:

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

第一个

定义定义为 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 应用程序还是我的文件。无论如何,虽然我很欣赏错误消息的能力,但我现在不应该收到。

关于如何知道这是否成功发生的想法、建议和想法?

已解决

我将启动进程的第一种方法放入 try-catch 中,效果很好。

【问题讨论】:

    标签: c# .net excel process


    【解决方案1】:

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

    如果进程资源已启动,则为真; 如果没有新的进程资源,则为 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
    }
    

    不过,考虑到这仍然会引发问题,您最好只在一个静态 .Start() 方法调用周围加上一个 catch。


    鉴于此,对 Process.Start() 的调用似乎很明显会起作用或不起作用,您可以通过返回值为 0(或抛出异常)来确定这一点。

    一旦您的流程开始了,您就可以对事物进行大量控制,通过 HasExited 等 Process 类的属性,您可以检查流程处于什么状态。

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

    【讨论】:

    • 我觉得自己像个白痴。返回一个布尔值是我检查的第一件事,但显然不够彻底。谢谢。
    • 相反,即使我没那么密集... Process.Start(string, string) 返回 Process:msdn.microsoft.com/en-us/library/h6ak8zt5.aspx。仍然是 try-catch 的诀窍。
    • @emragins 对此感到抱歉 - 我更新了关于 bool 版本如何工作的答案(我自己还不太了解文档)。它只是返回 bool 的 Process.Start() 的重载之一。但正如我上面所说 - 我认为无论如何你可能会更好地尝试捕捉。将其发布为答案。
    • 依赖 Process.start() 显然并不总是有效,因为该进程可能已经启动,而您的 Process 对象只是重新使用现有进程,这将返回 false。 Win32 异常的 try-catch 绝对是解决特定场景的方法。
    【解决方案2】:

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

    【讨论】:

    • 这似乎并没有真正解决问题。在程序退出之前,它不会让我确定该值。如果没有,那么我会收到一个新错误。但是,它确实让我找到了一个显而易见的解决方案,即把该死的 process.start 包装在一个 try-catch 语句中。
    【解决方案3】:

    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
    }
    

    【讨论】:

      【解决方案4】:

      为了准确判断进程是否真正启动,我尝试查找进程id,如果找到进程id就继续,如果找不到进程id就进入catch并打印debug语句。

      try
      {
           bool pathExists = File.Exists(module.ExecutionPath);
           if (pathExists)
           {
               ProcessStartInfo startArgs = new ProcessStartInfo();
               startArgs.FileName = "C:\Windows\System32\notepad.exe";
               startArgs.Arguments = null;
                 
               Process process = new Process();
               process.StartInfo = startArgs;
               process.Start();
                  
              Process startedProcess = CheckIfProcessStarted(process);
           }
      }
      catch (Exception ex)
      {
          Debug.WriteLine(ex.Message + "  " + ex.InnerException);
          Debug.WriteLine("Couldnt find the process so it never ran");
      }
              
      private Process CheckIfProcessStarted(Process process)
      {
          return Process.GetProcessById(process.Id);
      }
      

      【讨论】:

        猜你喜欢
        • 2010-11-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多