C# 如何知道Process.Start()是否成功?
我尝试了两种不同的方法来启动流程 第一个 定义定义为启动方法的参数:C# 如何知道Process.Start()是否成功?,c#,.net,excel,process,C#,.net,Excel,Process,我尝试了两种不同的方法来启动流程 第一个 定义定义为启动方法的参数: System.Diagnostics.Process.Start(“excel”,string.Format(“\”{0}\”,ExcelFileBox.Text.ToString()) 我的想法: 这一次开始很好,但我不知道如何从中获得反馈 第二个 我开始研究ProcessStartInfo,因为我想知道Excel是否成功启动——例如,虽然它很可能存在于用户的机器上,但无法保证,如果我向用户指出它已成功启动,而它还没有启动,
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中,它工作得很好。您可以检查属性中的0
(成功)值。进程。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
}
上的MSDN页面声明此方法具有布尔类型的重载,其中返回值表示:
如果流程资源已启动,则为true;
如果没有新的进程资源,则为false
已启动(例如,如果现有
过程被重用)
此外,它还可以引发三个异常:
- 无效操作例外
在流程组件的StartInfo中未指定文件名
-或
StartInfo属性的ProcessStartInfo.UseShellExecute成员为true,而ProcessStartInfo.RedirectStandardInput、ProcessStartInfo.RedirectStandardOutput或ProcessStartInfo.RedirectStandardError为true
- Win32异常
打开关联文件时出错
- 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
}
尽管如此,考虑到这仍然会抛出错误,您可能更倾向于仅围绕其中一个static.Start()方法调用包装一个捕获
有鉴于此,对Process.Start()的调用显然会起作用或不起作用,您可以通过返回值为0(或引发异常)来确定这一点
一旦您的流程启动,您就可以通过诸如HasExited之类的流程类属性对事情进行大量控制,从而可以检查流程处于何种状态
简而言之,如果用户的计算机上没有excel,Process.Start()将引发异常。为了准确确定进程是否实际启动,我尝试查找进程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);
}
这似乎并不能真正解决问题。。在程序退出之前,它不会让我确定该值。如果没有,那么我会得到一个新的错误。但是,这确实让我找到了一个显而易见的解决方案,那就是结束这个该死的过程。从一个try-catch语句开始。我觉得自己像个白痴。我检查的第一件事就是退回一个bool,但显然还不够彻底。谢谢。恰恰相反,即使我也没那么笨。。。进程。开始(字符串,字符串)返回进程:。仍然是一个try-catch可以做到这一点。@emragins对此表示抱歉-我更新了关于bool版本如何工作的答案(我自己还没有完全理解文档)。它只是返回bool的Process.Start()的重载之一。但正如我在上面所说的,我认为不管怎样,你们最好还是尝试一下接球。将其作为答案发布。依赖Process.start()显然并不总是有效的,因为该流程可能已经启动,而您的流程对象只是在重新使用现有流程,这将返回false。Win32异常的try catch绝对是解决特定场景的方法。