【问题标题】:Why dialog form hangs up application after Application.Exit() call?为什么在 Application.Exit() 调用后对话框窗体会挂起应用程序?
【发布时间】:2017-10-22 19:38:35
【问题描述】:

我有一个 Windows 窗体应用程序,主窗体显示数据网格,双击其中一行后出现“详细信息窗体”(使用 ShowDialog 方法)。这个“详细信息表格”给我带来了一些麻烦,确切地说:

  1. 在对 Web 服务系统的长时间同步调用期间,将表单设置为“无响应”状态。回调表单隐藏在主窗口后面之后。除此之外一切正常。

  2. 在某些情况下,我需要使用Application.Exit 立即关闭应用程序。当“详细信息表格”打开时,应用程序就会挂断。即使Environment.ExitThread.CurrentThread.Abort 也不起作用。

我想知道您是否可以根据这些症状给我任何提示,可能是什么问题。我会给出一些代码示例,但我不知道在这种情况下什么是重要的。

【问题讨论】:

    标签: .net winforms devexpress


    【解决方案1】:

    如果立即关闭应用程序是项目要求的一部分,那么您不能让长时间的同步调用阻塞您的中止/退出代码。将长同步调用移至后台线程。

    【讨论】:

    • 我发现描述得不够清楚。点 1. 和 2. 没有连接,至少没有直接连接。
    • 在您的中止/退出代码(点 A)处设置一个断点,并在您的 Web 服务调用(点 B)和调试之后设置另一个断点。你会看到在通过 B 点之前你不能击中 A 点,但是你的要求是在 B 点之前击中 A 点,所以你需要将同步调用修改为异步。
    • 我的意思是我不需要调用Web服务来让应用程序挂断。打开“详细信息表单”就足够了。我只认为服务回调后的这种特殊行为可能是实现中相同错误的另一个症状。
    • Application.Exit 所做的是发布一条 WM_QUIT 消息。但是您正在运行另一个消息泵(模态形式),因此该消息被忽略 请参阅 Raymond 的模态,第 3 部分:WM_QUIT 消息以了解详细信息。顺便说一句,你不应该真的需要 Application.Exit,因为当一个模态表单打开时,用户期望主窗口的关闭按钮就像主窗口的其余部分一样被禁用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多