[英]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。
打開相關文件時出錯。
進程對象已經被釋放。
要使用 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.