在我的控制台应用程序中,我的代码看起来像
Process DKU = new Process();
DKU.StartInfo.FileName = "MSSQLExecutor.exe";
DKU.Start();
DKU.WaitForExit();
Console.WriteLine("lets move on ");
这工作正常,它等待MSSQLExecutor.exe完成其工作,之后 应用程序继续。
我的问题是,有时MSSQLExecutor.exe崩溃,Windows默认显示一个用于结束程序的对话框。此时,我的应用程序将永远等待用户单击“关闭”按钮。
我想避免这种情况,因为我的应用程序将在没有用户交互的情况下作为服务运行。
答案 0 :(得分:7)
Dialog会阻止该进程存在。
如果MSSQLExecutor
是您的应用,则应该解决问题。
但是你可以达到目标(隐藏对话框)。处理Application.ThreadException
和AppDomain.CurrentDomain.UnhandledException
Application.ThreadException +=new System.Threading.ThreadExceptionEventHandler(Application_ThreadException);
AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
// log the exception
}
static void Application_ThreadException(object sender, System.Threading.ThreadExceptionEventArgs e)
{
// log the exception
}
如果MSSQLExecutor
不是您的申请,您可以停用Dr. Watson
博士。 Watson是Microsoft Windows操作系统附带的应用程序调试程序。
答案 1 :(得分:5)
这是在外部进程中运行的常见问题。从here我建议为此应用程序设置最大超时值。
Process DKU = new Process();
DKU.StartInfo.FileName = "MSSQLExecutor.exe";
DKU.Start();
DKU.WaitForExit(10*60*1000);
if (!DKU.HasExited)
DKU.Kill();
Console.WriteLine("lets move on ");
答案 2 :(得分:1)
Relevent:Detecting process crash in .NET
另外,如果你只想等待这个过程完成,你可以致电Process.Kill。
答案 3 :(得分:0)
如果您不想阻止等待进程结束,请不要调用Process.WaitForExit()。这样做的目的是什么?如果您只需要知道它何时完成,请注册Process.Exited事件。在Process.Exited事件中,您可以检查Process.ExitCode以了解它是否因崩溃而结束。