Process.HasExited可以抛出InvalidOperationException的原因是什么?

问题描述:

我看到System.Diagnositics.Process.HasExited方法抛出InvalidOperationException异常,但消息文本属性对于抛出它的原因并不十分有用。在什么情况下抛出这个异常?Process.HasExited可以抛出InvalidOperationException的原因是什么?

如果上述两个答案记住进程的实例成员不是线程安全的,那么可能是下一个开始寻找的地方。

documentation指出InvalidOperation异常在没有进程与该对象关联的情况下被抛出。

您是否已使用Process.Start()开始该流程,或者是在您访问HasExited属性之前处理的流程?

post也处理相同的问题。

正如Obalix正确指出的那样,当没有进程附加到Process对象时,会抛出InvalidOperationException。当进程退出并在Process对象上调用了CloseDispose时,会发生这种情况。 Close从内存中释放与进程相关的所有资源。在致电Close之前,将这些数据保存在内存中,以便为您(程序员)提供有关退出过程的信息,例如ExitTimeExitCode

+0

+ =:在关闭/处理对象之前,底层系统会保留一些资源以允许您跟踪旧进程的状态,当您关闭/处理它时,它们将被释放,所以PID号码(和/或处理地址等)可能被重新用于另一个全新的过程。如果事后你三编辑查询他们进程的状态,你*可以*得到一个(缓存的)信息,例如,“PID = 2688被杀死,出口代码为0x34”,而2688号码*可能*已经再次运行,而你*可以*搞砸了。更糟糕的是:你可能会在新进程中获得(未缓存的)信息,并且肯定会搞砸。 – quetzalcoatl 2012-07-03 09:06:11

我看到相同的信息。如果你这样做它可以发生:

System.Diagnostics.Process proc = new System.Diagnostics.Process(); 
proc.StartInfo.FileName = "trash filename here.exe"; 
try 
{ 
    proc.Start(); 
} 
catch { }//proc should fail. 
try 
{ 
    if (proc.HasExited) 
    { 
     //.... 
    } 
} 
catch (System.InvalidOperationException e) 
{ 
    //cry and weep about it here. 
} 

如果proc.Start()上述失败,你应该哭哭泣节了。所以,如果你proc.Start()后赶上,一定要赶在proc.HasExited(以及许多System.Diagnostics.Process方法等。

不要叫Terminate.Close(),叫Terminate.CloseMainWindoe()代替。

然后你可以发出一个定时的等待,检查HasExited并且在需要时调用Kill()

+0

欢迎来到Stack Overflow!请考虑编辑您的帖子,以添加更多关于您的代码的解释以及为什么它可以解决问题。一个主要包含代码的答案(即使它正在工作)通常不会帮助OP了解他们的问题。 – SuperBiasedMan 2015-11-17 10:33:18