簡體   English   中英

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

[英]How to know if Process.Start() is successful?

我嘗試了兩種不同的方法來啟動一個過程。

首先

該定義被定義為 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 中,並且效果很好。

Process.Start()上的 MSDN 頁面指出此方法具有布爾類型的重載,其中返回值表示:

如果進程資源已啟動,則為 true; 如果沒有啟動新進程資源(例如,如果重用現有進程),則為 false。

此外,它可以拋出三個異常:

  • 無效操作異常

在 Process 組件的 StartInfo 中沒有指定文件名。

-或者-

StartInfo 屬性的 ProcessStartInfo.UseShellExecute 成員為 true,而 ProcessStartInfo.RedirectStandardInput、ProcessStartInfo.RedirectStandardOutput 或 ProcessStartInfo.RedirectStandardError 為 true。

  • Win32異常

打開相關文件時出錯。

  • 對象處理異常

進程對象已經被釋放。


要使用 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() 方法調用之一周圍包裹一個捕獲。


鑒於此,對 Process.Start() 的調用是否有效似乎很明顯,您可以通過返回值為 0(或拋出異常)來確定這一點。

一旦您的流程開始,您就可以對事物進行大量控制,通過 Process 類的屬性(例如 HasExited),您可以檢查流程處於什么狀態。

簡而言之 - 如果用戶在他們的機器上沒有 excel,Process.Start() 將拋出異常。

您可以檢查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
}

為了准確確定進程是否真正啟動,我嘗試查找進程 id,如果找到進程 id,它將繼續,如果找不到進程 id,它將進入 catch 並打印調試語句。

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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM