一个简单的应用程序是用CF 2.0编写的。就我而言,它是单线程的。
应用程序的两个部分是有意义的:一个事件处理程序,它处理由代表PDA的条形码扫描器(由制造商提供)的类引发的“条形码扫描”事件,以及一个每个运行的Windows.Forms.Timer的事件处理程序30秒。
最近,应用程序遭遇了一个错误唯一可能的原因,正如我所看到的,正是在Timer_Tick事件中处理Barcode Scanned事件。我完全确定这是不可能的,并且其中一个事件将在队列中等待,直到完成第一个事件。 MSDN中的Windows.Forms.Timer页面也确保它是常规的单线程计时器。由Barcode Scanned触发的代码更改了界面的某些部分,这不会导致异常,因此我假设它也是单线程的。不,我们没有使用DoEvents等。
任何人都可以肯定地告诉我这样的重入是不可能的,我应该更加努力地寻找其他可能的原因,反之亦然,他们遇到了同样的问题吗?
答案 0 :(得分:1)
Windows.Forms计时器将通过调用PostMessage在UI线程上发生。这是一种保证。 “条形码扫描”是如何进入的,完全取决于为您提供活动的图书馆的开发者。您当然应该不假设它将在与您的计时器相同的上下文中运行,除非您特别强制它(通过调用Control.Invoke)。即便如此,我也不相信你可以保证一个电话订单。
如果您认为重入可能是一个原因,那么解决方案相对简单 - 在两个处理程序中使用Monitor(计时器proc和事件)并锁定同一个对象。这将排除它是一个重入问题的可能性。如果问题消失,你就知道原因并且已经有了解决方法。如果问题仍然存在,那么你肯定知道它不是重入,你可以把注意力放在其他地方。
答案 1 :(得分:0)
我使用过的几乎每个条形码扫描组件都会运行一个后台线程,所以我会更仔细地看一下。