从事件调用时,Dialog挂起

时间:2012-03-21 06:54:15

标签: c# events dialog

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

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

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

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

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

没有看到代码就很难说,但我的猜测是:

  1. 您常见的非UI线程问题 - 因此请确保使用UI线程打开对话框
  2. 原生摩托罗拉驱动程序正在崩溃 - 没有开玩笑,这对我来说发生了很多 - 在我的情况下(WinCE设备上的紧凑框架)这不会冻结程序,但扫描程序将无法工作/接收任何消息之前重启设备
  3. 为了解决这个问题,您应该将用户对话框的显示/处理与事件分开,并确保在UI线程上调用它(Control.InvokeRequired / Control.Invoke)。