我想知道我是否可以捕获由我开始使用Process.Start(...)的另一个进程抛出的未处理异常
我知道我可以使用此链接捕获standered错误,但我想要的是捕获通常由.NET环境的Just In Time调试器捕获的错误,该窗口包含以下单词:"发生了未处理的异常在你的应用程序中.如果你继续,应用程序将忽略此错误并尝试继续.如果你单击退出,应用程序将立即关闭...."然后是异常消息,然后是"继续", "退出"按钮.
我正在编写一个应用程序来启动和监视C#中的其他应用程序.我正在使用System.Diagnostics.Process类来启动应用程序,然后使用Process.Responding属性监视应用程序,以每100毫秒轮询一次应用程序的状态.我使用Process.CloseMainWindow来停止应用程序或Process.Kill如果它没有响应就杀死它.
我注意到一种奇怪的行为,有时进程对象进入一种状态,即当底层进程在循环中挂起并且它不响应CloseMainWindow时,响应属性总是返回true.
重现它的一种方法是在启动流程实例后立即轮询Responding属性.所以举个例子
_process.Start();
bool responding = _process.Responding;
Run Code Online (Sandbox Code Playgroud)
将重现错误状态
_process.Start();
Thread.Sleep(1000);
bool responding = _process.Responding;
Run Code Online (Sandbox Code Playgroud)
将工作.将睡眠周期减少到500将再次引入错误状态.
启动后调用_process.Responding太快的东西似乎阻止了对象获取正确的Windows消息队列处理程序.我想我需要等待_process.Start完成它的异步工作.有没有比调用Thread.Sleep更好的方法来等待这个?我不太自信1000毫秒总是足够的.
有没有办法确定我的程序启动的进程已崩溃?目前,我发现的解决方案是查看Process.ExitCode和检查值:
this.STProcess = Process.Start(this.CreateProcessStartInfo());
this.STProcess.WaitForExit();
if (STProcess.ExitCode != 0)
{
//raise error event...
}
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更优雅(和准确)的方式来做到这一点?
我更喜欢C#中的答案,并且使用P/Invoke也很好.
PS - 我需要在Windows XP/Vista/7上工作