StateSubscriber.Subscribe 未处置

Posted

技术标签:

【中文标题】StateSubscriber.Subscribe 未处置【英文标题】:StateSubscriber.Subscribe was not disposed 【发布时间】:2020-11-18 11:00:01 【问题描述】:

我正在使用 Fluxor 开发一个服务器端应用程序,该项目现在包括六个 Actions 以及相应数量的 Reducer 和 Effects。完成后,我预计会有 20 多个带有相关减速器和效果的动作。

Fluxor 的状态管理运行良好,但随着我构建项目,我开始随机收到以下 InvalidOperationException:

System.InvalidOperationException
  HResult=0x80131509
  Message=DisposableCallback with Id "StateSubscriber.Subscribe" was not disposed.
  Source=Fluxor
  StackTrace:
   at Fluxor.DisposableCallback.Finalize()

我的代码中没有引发异常 - 它只是弹出。 StackTrace 并没有给我太多的帮助,我对如何诊断和纠正这个问题有点困惑。

当异常发生时,我的应用程序崩溃,然后通常会在启动时立即再次显示异常。 Rebuild All 似乎清除了它,但我怀疑存在垃圾收集/内存管理问题。

在我的代码中,我没有明确地处理任何 Fluxor 对象,并且期望在 Fluxor 框架中处理这些对象。然而,“StateSubscriber.Subscribe”让我想知道我是否应该处理 Fluxor 对象。有人可以给我一些最佳实践指导吗?

我正在使用 Fluxor 3.1.1,看到 3.2 刚刚发布。我会升级到那个,看看是否有任何变化。同时,我们将不胜感激有关如何诊断此问题的任何想法。

【问题讨论】:

没有代码我们帮不了你 该问题确实提供了足够的信息以提供帮助,不应关闭该问题。 【参考方案1】:

FluxorComponent 通过重写 OnInitialized 自动订阅状态。

这个错误的罪魁祸首是在覆盖方法时调用了错误的基方法,或者在覆盖Dispose时没有调用base;其他原因见:https://github.com/mrpmorris/Fluxor/blob/master/Docs/disposable-callback-not-disposed.md

【讨论】:

我明确订阅状态的唯一地方是我的索引页面的“受保护的覆盖异步任务 OnAfterRenderAsync(bool firstRender)”事件。当 firstRender 为 True 时,我订阅了 state 的 StateChanged 事件。那不是必须的吗?我不会在任何地方覆盖 Dispose。 从 FluxorComponent 下降,你根本不需要手动订阅任何状态,它会自动订阅/取消订阅。我会说您现有的问题是您正在订阅 OnAfterRenderAsync 并且从不退订。 对@Peter 的延迟表示歉意。是的,现在问题已经解决了,谢谢。你是对的,我没有退订,而且我的代码有点……“纠结”:) 在我的情况下,它是由异步/同步初始化方法之间的不匹配引起的;也就是说,如果你使用OnInitializedAsync,你应该调用base.OnInitializedAsync()而不是base.OnInitialized()

以上是关于StateSubscriber.Subscribe 未处置的主要内容,如果未能解决你的问题,请参考以下文章