c# - Action<T> 委托(delegate)与与处置相关的事件处理程序

标签 c# lambda delegates compact-framework

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

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

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

  1. 在这种情况下,与事件相比,Action 是类属性的处理方式是否存在关键差异?

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

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

谢谢。如果描述不够合理,我可以尝试在此处获取一些代码示例。

最佳答案

当不用作表达式树时,lambda 会转换为普通委托(delegate),所以这应该不是问题。

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

关于c# - Action<T> 委托(delegate)与与处置相关的事件处理程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5653183/

相关文章:

c# - 使用 IEnumerable<T> 作为委托(delegate)返回类型

iphone - 将 UINavigaitionController 连接到 Interface builder 中的委托(delegate)

c# - 如何释放 C++ WinRT 值结构的内存

c# - 使用定时器更新标签

function - 为什么要编写一个带有名称的 C++ lambda 以便可以从某个地方调用它?

asp.net-mvc-2 - 为什么 model => model.Reason_ID 变成 model =>Convert(model.Reason_ID)

c# - 如何使用 dotnetzip 检查文件是否存在于 zip 文件中

c# - C# 的 using 语句中止安全吗?

C# 我在寻找用于运行时属性替换的 Lambda/Expression/Func/Reflection 的什么构造?

c# - delegate 关键字与 lambda 表示法