代码之家  ›  专栏  ›  技术社区  ›  GSerg

.NET CF 2.0:可能的单线程可重入性

  •  0
  • GSerg  · 技术社区  · 16 年前

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

    应用程序的两个部分是有意义的:一个事件处理程序处理由代表PDA条码扫描器的类(由制造商提供)引发的“条码扫描”事件,另一个事件处理程序处理windows.forms.timer,每30秒运行一次。

    最近,应用程序遇到了一个bug,正如我所看到的,唯一可能的原因是在计时器勾选事件的中间处理条码扫描事件。我确信这是不可能的,其中一个事件将在队列中等待,直到第一个事件被完全处理。msdn中的windows.forms.timer页面还确保它是常规的单线程计时器。由条形码扫描触发的代码改变了接口的某些部分,这不会导致异常,所以我假设它也是单线程的。不,我们不使用DoEvents之类的。

    有人能肯定地告诉我,这样的重新进入是不可能的,我应该更努力地寻找其他可能的原因,或者相反,他们遭受了同样的问题?

    2 回复  |  直到 16 年前
        1
  •  1
  •   ctacke    16 年前

    windows.forms计时器将通过调用postmessage在UI线程上发生。这是保证。“条形码扫描”是如何进来的,这完全取决于图书馆的开发人员。你当然应该 假设它将在与计时器相同的上下文中运行,除非您特别强制它(通过调用control.invoke)。即使这样,我也不相信你能保证接到一个电话通知单。

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

        2
  •  0
  •   Quibblesome    16 年前

    我使用过的几乎所有条形码扫描组件都是由后台线程运行的,所以我会更仔细地看一看。