gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:16:19 26 4
gpt4 key购买 nike

我正在寻找架构建议以及对委托(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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com