【问题标题】:ObserveOn vs modifying code to run on main threadObserveOn 与修改代码以在主线程上运行
【发布时间】:2013-12-26 07:13:39
【问题描述】:

我有一个视图模型,可以在与 UI 线程分开的线程上触发各种对象的可观察对象。同时,还有订阅这些可观察对象的视图代码,需要更新 UI 线程上的控件。

在编码风格方面,使用ObserveOn 确保 OnNext 处理程序在 UI 线程上运行(即添加 ObserveOn 可以在另一个线程上触发的任何位置)更好,还是让 viewmodel 代码负责调用/schedule 在 UI 线程上(即不需要 ObserveOns,但有一次需要丑陋的调用/调度 lambda),或者任何一个选项都和另一个一样好?

【问题讨论】:

    标签: c# multithreading coding-style system.reactive reactiveui


    【解决方案1】:

    在这里看看我的回答:ObserveOn and SubscribeOn - where the work is being done

    一旦你理解了这一点,具体的答案就应该很清楚了,这将取决于你的 Rx 查询是如何工作的。

    一般来说,您希望尽量减少在 UI 线程上完成的工作,因此在订阅后尽快离开 UI 线程(必要时使用 SubscribeOn),并尽可能晚地使用ObserveOn。您通常会将这些应用于链中的最后一个运算符。

    【讨论】:

      【解决方案2】:

      我会说最好使用ObserveOn 或其他一些 Rx 调度机制在 UI 线程上运行工作,因为那样您的解决方案仍然只是 Rx 代码并且仍然是可组合的。如果您将 Rx 用于逻辑,然后使用其他非 Rx 调度机制在 UI 线程上运行最后一位,那么您的代码在切换机制时可能会更加混乱,并且可组合性更差。坚持使用ObserveOn 让事情变得更简单。

      【讨论】:

      • 我自己的问题可能措辞不够好。对于重写代码以使用非 Rx 调度的场景,这与代码隐藏/视图模型代码有关,即我不需要在视图中为所有受影响的订阅添加多个 ObserveOns跨度>
      • 没有实际的代码示例,您的问题的答案太多了:)
      • 使用 ObserveOn 可以将单元测试中的调度程序替换为即时,这样您就可以测试您的 ViewModels
      猜你喜欢
      • 2018-06-28
      • 2022-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 1970-01-01
      • 2021-01-18
      相关资源
      最近更新 更多