【问题标题】:Dialog hangs when called from event从事件调用时对话框挂起
【发布时间】:2012-03-21 06:54:15
【问题描述】:

使用 Motorola 提供的 CoreScanner 驱动程序,我正在尝试编写一个使用条形码扫描仪的小型 winforms 应用程序。我能够很好地与扫描仪交互,并正确注册 OnBarcodeEvent() 的回调。在这个回调中,我有一个对话框,它打开并显示用户需要填写的屏幕。对话框打开后不久(使用 Show()),程序挂起。如果我使用 ShowDialog(),对话框可以工作,但对话框会阻止 OnBarcodeEvent 事件。

我对正在发生的事情的猜测是,由于对话框是在事件线程上创建的,因此在使用 Show() 时会出现竞争条件。由于 Show() 是非阻塞的,因此线程在显示对话框后继续运行,然后消失。与此同时,我的对话框刚刚失去了它的父级并锁定了?就像我说的......我的最佳猜测。

我该如何补救这种情况?也就是说,我如何编写我的对话框,以便它可以在不挂起的线程中创建?

【问题讨论】:

    标签: c# events dialog


    【解决方案1】:

    在这种情况下,您应该启动一个不同的线程来创建您的对话框表单并在其上显示该表单。您需要阻止此线程,直到表单可见 - 这可以通过 ShowDialog 或交替使用 Application.Run 重载之一。

    另一种选择是在 UI 线程(即主应用程序线程)上显示表单 - 为此,您需要从事件代码在主表单上调用 Invoke 方法。调用调用应采用非模态显示对话框形式的委托。

    【讨论】:

      【解决方案2】:

      我对 Motorola/Symbol 手持设备 (MC9090) 有一些经验,我猜 SDK 会类似。

      不看代码很难说,但我的猜测:

      1. 您常见的非 UI 线程问题 - 因此请确保您使用 UI 线程打开对话框
      2. 本地摩托罗拉驱动程序崩溃 - 不开玩笑,这发生在我身上很多 - 在我的情况下(WinCE 设备上的紧凑框架)这不会冻结程序,但扫描仪将无法工作/之前接收任何消息重启设备

      为了解决这个问题,您应该将用户对话框的显示/处理与事件分开,并确保在 UI 线程 (Control.InvokeRequired / Control.Invoke) 上调用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-15
        • 2015-06-27
        • 1970-01-01
        相关资源
        最近更新 更多