【问题标题】:Calling .exe from c# crashes and thread is stalled从 c# 调用 .exe 崩溃并且线程停止
【发布时间】:2013-10-05 18:01:12
【问题描述】:

我正在启动一个这样的 .exe

ProcessStartInfo start = new ProcessStartInfo();
start.Arguments = stuff;
start.FileName = "test.exe";
try{
    using (Process proc = Process.Start(start))
    {
            proc.WaitForExit();
    ...
    }
}
catch
{
...}

来自一个线程。问题是有时“test.exe”会崩溃,打开一个弹出窗口说

“应用程序崩溃等等等等。在互联网上寻找解决方案等等”

“test.exe”崩溃是意料之中的,但我需要的是或关闭弹出窗口以释放线程,或首先“捕获”exe崩溃。

代码中的 try-catch 不会捕获崩溃的 exe。

你能帮忙吗? 谢谢

【问题讨论】:

  • 要检测崩溃,您需要检查退出代码。
  • @DarrenKopp 崩溃的程序会在“此程序已崩溃”弹出窗口出现之前返回退出代码吗?
  • 好吧,WaitForExit 在程序退出之前不会运行,无论是在该消息发生之前还是之后发生,我不确定,但我猜它是在之后(因为你可以附加调试器通过该消息)

标签: c# multithreading popupwindow


【解决方案1】:

据我所知,您无法从您的应用程序中实现这一点。这是系统级别的设置。有关如何禁用对话的详细信息,请参阅例如How do I disable the 'Debug / Close Application' dialog on Windows Vista?,但请注意它必须在每台机器上设置并影响所有程序。

【讨论】:

【解决方案2】:

在 Windows Vista 和更高版本中,可以使用名为 Application Restart & Recovery 的功能。除其他事项外,应用程序可以注册由 WER(Windows 错误报告)在此类事件上调用的处理程序过程。该方法可以做某些事情。例如,您可以编写堆栈跟踪,这在应用程序停止响应 (AppHang) 时通常很有用。

请注意,该函数必须表现得很好,即遵循一定的规则做什么,什么时候做,什么不做,否则 WER 会杀死这个恢复线程。我强烈建议查看 MSDN。

顺便说一句,您的描述缺少确切的崩溃消息,您应该添加该信息。所谓的“崩溃”有多种可能的原因。如果没有这些信息并给出上面的代码,这有点猜测。

【讨论】:

    猜你喜欢
    • 2014-12-24
    • 1970-01-01
    • 2012-06-04
    • 2017-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多