Action <t>委托与与dispose相关的事件处理程序</t>

时间:2011-04-13 17:32:00

标签: c# lambda delegates compact-framework

我正在寻找建筑建议以及对代表和lambdas的更深入理解(除了需要解决一个真正的问题!)

我们有代码通过pda上的串口与设备(规模)进行交互。我们连接视图以从设备接收数据。由于一次只有一个视图“连接”到我们的缩放实例,因此我们使用了Action类型的属性来处理缩放实例和视图之间的交互(而不是订阅事件)。然后,该视图将该属性设置为lambda,该lambda从缩放中获取值并修改UI。

我们目前遇到的问题是处理我们的观点。如果当用户关闭视图时(当时我们使用CF强制执行Dispose),当标尺当前正在发送数据(并且我们在Action处理程序内)时,应用程序挂起:Action lambda永远不会运行AND尝试关闭SerialPort时,缩放实例的处理会挂起。

  1. 与事件相比,在类似情况下处理类属性的行为是否存在关键差异?

  2. 根据日志详细信息,在视图上调用Dispose时,代码位于Action lambda(修改某些UI元素)内。这些都在UI线程上 - 它们如何同时运行?昨晚我的睡眠不足吗?

  3. 有没有人在这里看到一些应该纠正的糟糕建筑决策?

  4. 谢谢。如果描述没有足够的意义,我可以尝试在这里获取一些代码示例。

2 个答案:

答案 0 :(得分:2)

当不用作表达式树时,lambda会转换为普通委托,因此不应该是问题。

但整个事情听起来像死锁/并发问题。而不是直接关闭串行端口,在动作处理程序的持续时间内使用一个信号(可能在另一个线程中同时运行 - 再次检查),以便您可以在关闭端口之前正常等待它终止。 / p>

答案 1 :(得分:1)

  1. 不 - 事件实际上只是一个委托,就像行动

  2. 一样
  3. 它们不能在同一个线程中同时运行 - 更有可能是在一个单独的线程中处置,或者动作处理程序在一个单独的线程中运行。如果这是响应串口发生的,请认识到串口事件发生在后台线程上。

  4. 这里确实没有足够的信息来说明从架构的角度来看应该或不应该改变什么。话虽这么说,我怀疑你为什么不使用事件 - 使用“动作”与使用事件处理程序没有任何优势,但后者听起来更像是更符合心理模型,并且会更多地显示你的意图清楚。