【问题标题】:Should I unsubscribe from all my controllers events while not needed?我应该在不需要时取消订阅所有控制器事件吗?
【发布时间】:2015-03-31 14:47:21
【问题描述】:

我有 Winforms 应用程序。我的应用程序获取 Pcap 文件并通过机器适配器传输来自该文件的所有数据包。

在我的 UI 中,我有许多控制器事件,例如我所有的 GridView 事件 (CellChanged, RowChanged...)

虽然我的应用程序处于传输过程中,但我不需要它,我的所有UI 更新都是通过计时器检查负责此传输的我的类,所以我的问题是我应该取消订阅所有这些事件吗?

这样做有好处吗?

【问题讨论】:

  • 不,这通常没有必要或有利。
  • 如果有的话它可能会减慢你的应用程序
  • 取消订阅所有这些事件会降低我的应用速度??
  • 退订需要时间,再次订阅需要时间,而且很容易出错。除非您要关闭所有内容,否则将其扔掉,然后再重新创建。订阅事件本身并不需要任何费用。
  • 但是这需要时间吗?单击我的播放按钮后,在播放操作之前我取消订阅并立即开始播放,我没有看到任何冻结或其他东西。

标签: c# winforms events


【解决方案1】:

如果这些事件完成了他的工作并且将来不需要执行这些事件,您可以取消订阅某些事件。如果您在执行某些操作时不需要执行它,也可以取消订阅事件。

【讨论】:

    【解决方案2】:

    您无需取消订阅事件。由于您的 UI 通过计时器更新,因此只需在计时器上使用您想要的事件。退订不会给您带来太多优势

    谢谢。

    【讨论】:

      【解决方案3】:

      编辑:似乎我的回答很简短,为您添加了更多选项:

      • 您将不再使用控制器:UNREGISTER - 对象将保留在内存中,直到存在对它们的任何引用。因此,您将最大限度地减少内存泄漏。
      • 您将在另一个 UI 中使用控制器:UNREGISTER - 内存泄漏将在 UI 对象一侧。
      • 您将再次使用 UI 和控制器:您可以取消注册并再次注册它们,或者只是添加一个布尔值,表明这些处理程序应禁用一段时间。

      如果处理程序执行一些扩展代码,您还可以在不需要时停止执行它们时看到性能改进。

      【讨论】:

      • 我不是投反对票的人,而是几个 cmets,尤其是现在你说你认为你被投反对票是因为你的答案太短了。你的答案的问题是你错了。首先,关于内存泄漏的可能性,OP的问题中没有任何内容表明他的程序庞大而复杂并且容易出现内存泄漏问题,或者UI事件处理程序订阅可能导致内存泄漏。
      • 其次,OP 描述了事件处理程序的用途 - 它们显然涉及格式化网格数据,并且它们不太可能执行“扩展代码”,尤其是当 UI 没有用过的。因此,通过取消订阅来获得“性能改进”的想法是非常、非常不可能的——如果这是真的,这将表明应该正确修复一个错误,而不仅仅是通过取消订阅和订阅有问题的事件处理程序来解决。
      • 感谢您的解释。我们可以猜测应用程序的大小非常小,因此泄漏不是主要问题。我自己也开始想到它们,当我的应用程序增长时,用户将其保持打开 14 天并开始收到 OutOfMem 异常。如果他早点开始考虑它们,只会对他更好。
      • EventHandlers - 他们看不到我的格式,而是输入格式。所以从我的角度来看,我可以想象当文件路径进入网格时开始文件传输,这可能会出现严重的并发问题等。但没有必要。
      猜你喜欢
      • 2022-01-02
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2020-05-30
      • 1970-01-01
      • 2019-10-25
      • 1970-01-01
      相关资源
      最近更新 更多