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

Ste*_*eve 5 c# lambda delegates compact-framework

我正在寻求架构建议以及对委托和 lambda 的更深入理解(除了需要解决实际问题之外!)

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

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

  1. 与事件相比,在这种情况下处理类属性 Action 是否存在关键区别?

  2. 根据日志详细信息,当在视图上调用 Dispose 时,代码位于 Action lambda(修改一些 UI 元素)内。它们都在 UI 线程上——它们怎么能同时运行呢?是我昨晚没睡够吗?

  3. 有人在这里看到一些应该纠正的糟糕的架构决策吗?

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

Luc*_*ero 2

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

但整件事听起来像是一个死锁/并发问题。不要直接关闭串行端口,而是在操作处理程序期间使用信号(可能在不同的线程中同时运行 - 再次检查),以便您可以在关闭端口之前优雅地等待它终止。