0

一个简单的应用程序是用 CF 2.0 编写的。就我而言,它是单线程的。

该应用程序的两个部分很有趣:一个事件处理程序处理由代表 PDA 的条形码扫描仪(由制造商提供)的类引发的“条形码扫描”事件,以及一个每 30 秒运行一次的 Windows.Forms.Timer 事件处理程序。

最近,该应用程序遇到了一个错误,正如我所见,唯一可能的原因是在 Timer_Tick 事件中间处理 Barcode Scanned 事件。我绝对确定这是不可能的,并且其中一个事件将在队列中等待,直到第一个事件被完全处理。MSDN 中的 Windows.Forms.Timer 页面还确保它是一个常规的单线程计时器。由 Barcode Scanned 触发的代码会更改界面的某些部分,不会导致异常,因此我假设它也是单线程的。不,我们没有使用 DoEvents 等。

任何人都可以肯定地告诉我,这种重入是不可能的,我应该更加努力地寻找其他可能的原因,反之亦然,他们遇到了同样的问题?

4

2 回答 2

1

Windows.Forms 计时器将通过调用 PostMessage 在 UI 线程上发生。那是一种保证。“条形码扫描”如何进入完全取决于为您提供事件的库的开发人员。您当然应该假设它将在与您的计时器相同的上下文中运行,除非您特别强制它(通过调用 Control.Invoke)。即使这样,我也不相信您可以保证呼叫订单。

如果您认为重入可能是一个原因,则解决方案相对简单 - 在两个处理程序(计时器进程和事件)中使用 Monitor 并锁定同一个对象。这将排除这是一个可重入问题的可能性。如果问题消失了,您就知道原因并且已经有了解决办法。如果问题仍然存在,那么您可以确定这不是可重入,您可以将注意力集中在其他地方。

于 2008-12-17T02:07:57.400 回答
0

我使用过的几乎每个条形码扫描组件都运行在后台线程上,所以我会更仔细地研究一下。

于 2008-12-19T20:33:59.957 回答