Process.HasExited可以抛出InvalidOperationException的原因是什么?
我看到System.Diagnositics.Process.HasExited
方法抛出InvalidOperationException异常,但消息文本属性对于抛出它的原因并不十分有用。在什么情况下抛出这个异常?Process.HasExited可以抛出InvalidOperationException的原因是什么?
如果上述两个答案记住进程的实例成员不是线程安全的,那么可能是下一个开始寻找的地方。
documentation指出InvalidOperation异常在没有进程与该对象关联的情况下被抛出。
您是否已使用Process.Start()
开始该流程,或者是在您访问HasExited
属性之前处理的流程?
这post也处理相同的问题。
正如Obalix正确指出的那样,当没有进程附加到Process
对象时,会抛出InvalidOperationException
。当进程退出并在Process
对象上调用了Close
或Dispose
时,会发生这种情况。 Close
从内存中释放与进程相关的所有资源。在致电Close
之前,将这些数据保存在内存中,以便为您(程序员)提供有关退出过程的信息,例如ExitTime
和ExitCode
。
我看到相同的信息。如果你这样做它可以发生:
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()
欢迎来到Stack Overflow!请考虑编辑您的帖子,以添加更多关于您的代码的解释以及为什么它可以解决问题。一个主要包含代码的答案(即使它正在工作)通常不会帮助OP了解他们的问题。 – SuperBiasedMan 2015-11-17 10:33:18
+ =:在关闭/处理对象之前,底层系统会保留一些资源以允许您跟踪旧进程的状态,当您关闭/处理它时,它们将被释放,所以PID号码(和/或处理地址等)可能被重新用于另一个全新的过程。如果事后你三编辑查询他们进程的状态,你*可以*得到一个(缓存的)信息,例如,“PID = 2688被杀死,出口代码为0x34”,而2688号码*可能*已经再次运行,而你*可以*搞砸了。更糟糕的是:你可能会在新进程中获得(未缓存的)信息,并且肯定会搞砸。 – quetzalcoatl 2012-07-03 09:06:11