You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在ReactiveUI中创建可主动推送值的IObservable对象?

你要的功能是Rx.NET基础库的原生实现,ReactiveUI基于Rx.NET构建,直接使用对应的内置类型即可,不需要用Observable.FromEvent做兼容处理。

  • 基础场景用Subject<T>
    它同时实现了IObservable<T>和IObserver<T>接口,你需要的手动推送新值能力对应它的OnNext(T value)方法,调用后所有订阅者都会收到新值,完全符合需求。
    示例代码:

    // 实例化Subject
    var numberSubject = new Subject<int>();
    // 作为IObservable订阅
    numberSubject.Subscribe(value => Console.WriteLine($"接收到新值:{value}"));
    // 手动推送新值
    numberSubject.OnNext(1024); // 所有订阅者都会收到1024
    
  • 需要保留最新值给新订阅者用BehaviorSubject<T>
    如果期望后续新加入的订阅者能直接收到最近一次推送的值,可以用BehaviorSubject<T>,创建时需要指定初始值:
    示例代码:

    // 初始化时指定默认值为0
    var statusSubject = new BehaviorSubject<int>(0);
    // 首次订阅直接收到初始值0
    statusSubject.Subscribe(v => Console.WriteLine($"订阅1收到值:{v}"));
    statusSubject.OnNext(1); // 已存在的订阅都会收到1
    // 后续新订阅直接收到最近一次推送的1
    statusSubject.Subscribe(v => Console.WriteLine($"订阅2收到值:{v}"));
    
  • 需要适配ReactiveUI调度体系用ScheduledSubject<T>
    如果推送的值需要绑定到UI更新,你可以用ReactiveUI提供的ScheduledSubject<T>,指定调度器后通知会自动在对应线程触发,避免跨线程操作UI的异常:
    示例代码:

    // 指定用主线程调度器触发订阅回调
    var uiNotifySubject = new ScheduledSubject<string>(RxApp.MainThreadScheduler);
    

以上都是Rx生态的标准实现,比Observable.FromEvent的封装方案更轻量,也符合响应式编程的设计规范。

内容的提问来源于stack exchange,提问作者Mason Wheeler

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 15:48:02