0

我有一个通过第三方 DLL 访问连接设备的 Windows Mobile 程序。对设备的每次调用都可能花费未知的时间长度,因此每次调用都包含一个超时属性。如果调用返回的时间超过指定的超时时间,则 DLL 会引发异常,我的应用程序可以毫无问题地捕获该异常。

我遇到的问题是关闭应用程序。如果我的应用程序调用了 DLL 并等待超时发生,然后我在超时发生之前关闭了应用程序,我的应用程序将锁定并要求重新启动 PDA。

在正常情况下,我可以确保应用程序在关闭之前等待超时。但是,我试图用来AppDomain.CurrentDomain.UnhandledException捕获程序中任何未处理的异常,并使用该事件来等待这个挂起的超时发生,以便最终关闭程序。

我的问题是这个事件似乎没有持续足够长的时间。如果我MessageBox.Show("unhandled exception");在事件中添加一行,然后从我的应用程序的主窗体中抛出一个新的未处理异常,我会在一瞬间看到消息框,但随后它会在我没有单击“确定”按钮的情况下消失。

我在此事件上找到的文档表明,当它被调用时,应用程序已完全致力于关闭并且无法停止关闭,但我认为这并不意味着事件方法本身不会完成。什么给了(我想这就是问题)?

更新: 在完整的窗口(Vista)中,这可以按预期工作,但前提是我使用了Application.ThreadException.Net CF 2.0中不存在的事件。

4

1 回答 1

3

我也遇到过这个问题。这是 .NET CF (v2.0) 中的一个已知问题,但我在使用 v3.5 时也遇到了它(尽管它发生的情况更具体)。您可以在此处找到(旧且仍然有效的)错误报告。

调用 MessageBox.Show() 会导致它立即关闭,但在我的情况下,有两种解决方法:1) 第二次调用 MessageBox.Show()。然后它会阻塞直到被用户关闭。您可以通过检查 DialogResult 来检查第一个 MessageBox.Show() 是否过早关闭。我不记得它在失败时究竟返回了哪个结果,我记得它给出了一个非默认结果。

2)创建一个自定义表单并在其上调用 ShowDialog() 。它对我有用,但其他人报告说它不起作用。你也可以调用 Show() 并让它自己阻塞(不要忘记调用 Application.DoEvents() 以便它继续处理事件)。

于 2010-04-19T07:56:07.767 回答