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

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

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

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

    该应用程序的两个部分令人感兴趣:一个事件处理程序,处理由表示PDA条形码扫描仪(由制造商提供)的类引发的“条形码扫描”事件,以及一个Windows事件处理程序。形式。每30秒运行一次的计时器。

    最近,应用程序遇到了一个错误,正如我所看到的,唯一可能的原因是在Timer_Tick事件的中间处理BarcodeScanned事件。我绝对确定这是不可能的,其中一个事件会在队列中等待,直到第一个事件完全处理完毕。窗户。形式。MSDN中的计时器页面还确保它是一个常规的单线程计时器。由条形码扫描触发的代码会更改接口的某些部分,这不会导致异常,所以我假设它也是单线程的。不,我们没有使用DoEvents或类似工具。

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

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

    窗户。窗体计时器将通过调用PostMessage在UI线程上发生。这是一种保证。“条形码扫描”的方式完全取决于为您提供活动的库的开发人员。你当然应该 不 假设它将在与计时器相同的上下文中运行,除非您特别强制它(通过调用Control.Invoke)。即使这样,我也不相信你能保证接到电话订单。

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

        2
  •  0
  •   Quibblesome    17 年前

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

    推荐文章