来自MSDN:
返回值true表示新的进程资源 开始。 如果FileName成员指定的进程资源 StartInfo属性已在计算机上运行,没有 启动其他流程资源。相反,运行过程 资源被重用并返回false。
尝试这样的事情:
var info = new ProcessStartInfo {FileName = @"CMD"};
var p1 = new Process
{
StartInfo = info
};
var result = p1.Start(); //true
result = p1.Start(); //true
var p2 = new Process
{
StartInfo = info
};
result = p2.Start(); //true
如果我使用FilePath = @"c:\myapp.exe"
代替CMD
,则会得到相同的结果。
在什么情况下会返回false
?
答案 0 :(得分:11)
如果您查看参考来源,您会看到Process.Start
如何运作:
http://referencesource.microsoft.com/System/R/c50d8ac0eb7bc0d6.html
这是调用Process.Start
时调用的两种方法之一。请注意底部附近返回值true或false。只有在启动进程后,它无法获取已启动进程的句柄,才会返回False。
要开始此过程,请使用NativeMethods.CreateProcess
,您可以在此处找到来源:http://referencesource.microsoft.com/System/compmod/microsoft/win32/NativeMethods.cs.html#9c52a5ca5f3eeea3
这只是Kernel32.CreateProcess
的方法原型,其API可在此处找到:https://msdn.microsoft.com/en-us/library/windows/desktop/ms682425(v=vs.85).aspx
如果查看返回值,则说:
如果函数成功,则返回值为非零。 如果函数失败,则返回值为零。
我在CreateProcess
的API中找不到任何说明如果请求的进程已经运行就失败的内容,可能是因为它是单实例应用程序(如Outlook)而无法启动,然后它可能会失败,但对于像命令提示符这样的多个实例应用程序,它应该不会无法创建进程的句柄。
所以,在说了这么多之后,有可能MSDN文档不完全正确,我没有你的链接,但对于Process.Start(StartInfo)
,MSDN说这个关于返回值:< / p>
与流程资源关联的新流程,如果未启动流程资源,则为null。 请注意,与已经运行相同进程的实例一起启动的新进程将独立于其他进程。此外,Start可能会返回一个非空进程,其HasExited属性已设置为true。在这种情况下,启动的进程可能已激活其自身的现有实例,然后退出。
(我强调的重点)。它并没有说如果它已经运行,它将失败。
对于Process.Start()
,它说:
返回值 键入:System.Boolean 如果启动了进程资源,则为true;如果没有启动新的进程资源,则返回false(例如,如果重用现有进程)。
所以它说如果重用现有流程,这完全取决于正在启动的应用程序或启动它的方法。