WindowsMo​​bile:从DialogForm处理异常后应用程序退出

Hen*_*man 1 c# exception windows-mobile winforms

我有以下简单的场景:

带有Button的DialogForm,Button_click会抛出异常.

带有按钮和标签的MainForm,在单击中我在Catch块内显示DialogForm的新实例.

如果我在常规WinForms中运行此设置,我可以按预期捕获异常.

如果我在WinMobile中运行它(我在WM5和WM6 Pro上测试过),我可以看到调试器输入了Catch块但是Exception继续传播并且App死了.

MainForm中的代码如下所示:

try
{
   using (DialogForm frm = new DialogForm())
   {
     DialogResult r = frm.ShowDialog();
     label1.Text = r.ToString();
  }
}
catch (Exception ex)
{
  label1.Text = ex.Message;
}
Run Code Online (Sandbox Code Playgroud)

编辑:

我进一步调查了一下,在这段代码和Application.Run()周围有一个catch {}块,应用程序仍然退出.

显然它不是一个失控的异常,被抓住并处理得很好.但在此操作之后,它看起来像应用程序执行不需要的Exit().

Hen*_*man 5

经过修修补补后,我找到了有效的方法:

try {
  // show Dialog that Throws
}
catch (Exception ex) {
  label1.Text = ex.Message;
  Application.DoEvents();  // this solves it
}
Run Code Online (Sandbox Code Playgroud)

对于任何能告诉我为什么 DoEvents()是必要的人来说,赏金仍然是开放的.

  • 线程与它无关.当您调用ShowDialog时,会为该对话框设置单独的消息泵,并在那里处理所有内容.我敢打赌,异常会通过PostMessage封送回UI线程,直到发生某些事情导致该消息被调度 (2认同)

ste*_*ell 5

您需要'DoEvents'的原因是,当表单仍然可用时,这会清除消息队列.

发生的事情是仍有消息等待处理抛出异常的表单.通过在这里调用'DoEvents',您可以在使用块清理表单并停止处理队列中的消息之前对它们进行处理.