使用摩托罗拉提供的CoreScanner驱动程序,我试图编写一个使用条形码扫描仪的小型winforms应用程序。我能够很好地与扫描仪进行交互,并正确地为OnBarcodeEvent()注册回调。在这个回调中,我有一个Dialog,它打开并显示一个用户需要填写的屏幕。对话框打开后不久(使用Show()),程序挂起。如果我使用ShowDialog(),对话框可以工作,但对话框阻止了OnBarcodeEvent事件。
我对正在发生的事情的猜测是,由于在事件线程上创建了对话框,因此在使用Show()时会出现争用情况。由于Show()是非阻塞的,因此线程在显示对话框后继续,然后消失。与此同时,我的对话框失去了它的父母并锁定了?就像我说的......我最好的猜测。
我该如何纠正这种情况?也就是说,如何编写我的对话框以便可以在线程中创建它而不会挂起?
答案 0 :(得分:1)
在这种情况下,您应该启动一个不同的线程来创建对话框表单并在其上显示表单。您需要阻止此线程直到表单可见 - 这可以通过ShowDialog
或者使用Application.Run重载之一来实现。
另一种选择是在UI线程(即主应用程序线程)上显示表单 - 为此,您需要从事件代码中调用主表单上的Invoke
方法。调用调用应该采用将以非模态方式显示对话框形式的委托。
答案 1 :(得分:0)
我对摩托罗拉/ Symbol手持设备(MC9090)有一些经验,我猜SDK会类似。
没有看到代码就很难说,但我的猜测是:
为了解决这个问题,您应该将用户对话框的显示/处理与事件分开,并确保在UI线程上调用它(Control.InvokeRequired / Control.Invoke)。