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

Prism EventAggregator是否支持热订阅?如何让新订阅接收最新事件数据

实现带最后值缓存的Prism EventAggregator事件

要解决新订阅无法接收初始发布事件的问题,你需要自定义一个继承自PubSubEvent<T>的事件类,在内部维护最后一次发布的数据,并在新订阅完成时主动推送给订阅者,以此实现类似hot observable的效果。

1. 定义带缓存的自定义事件类

public class CachedPubSubEvent<T> : PubSubEvent<T>
{
    private T _lastPublishedValue;
    private bool _hasPublished;

    public override void Publish(T payload)
    {
        _lastPublishedValue = payload;
        _hasPublished = true;
        base.Publish(payload);
    }

    public override SubscriptionToken Subscribe(Action<T> action, ThreadOption threadOption = ThreadOption.PublishedThread, bool keepSubscriberReferenceAlive = false, Predicate<T> filter = null)
    {
        var token = base.Subscribe(action, threadOption, keepSubscriberReferenceAlive, filter);
        
        // 若已有发布记录,且订阅过滤器匹配最后一次值,主动推送
        if (_hasPublished && (filter == null || filter(_lastPublishedValue)))
        {
            // 按指定线程选项处理推送
            switch (threadOption)
            {
                case ThreadOption.UIThread:
                    Application.Current.Dispatcher.Invoke(() => action(_lastPublishedValue));
                    break;
                case ThreadOption.BackgroundThread:
                    Task.Run(() => action(_lastPublishedValue));
                    break;
                default:
                    action(_lastPublishedValue);
                    break;
            }
        }

        return token;
    }
}

2. 使用自定义事件类

发布事件时,获取该自定义事件实例:

// 发布初始事件
var eventAggregator = Container.Resolve<IEventAggregator>();
eventAggregator.GetEvent<CachedPubSubEvent<string>>().Publish("初始加载数据");

新视图初始化时订阅,将自动收到最后一次发布的值:

// 视图内订阅事件
var eventAggregator = Container.Resolve<IEventAggregator>();
eventAggregator.GetEvent<CachedPubSubEvent<string>>().Subscribe(value =>
{
    // 处理数据,包括初始发布的"初始加载数据"
    YourDisplayControl.Text = value;
});

3. 关键注意事项

  • 取消订阅后再次订阅仍能获取最后值,每次Subscribe都会触发缓存检查逻辑。
  • 严格按照线程选项推送,避免UI操作在非UI线程执行导致异常。
  • 针对值类型事件,通过_hasPublished标志区分“未发布”和“发布了默认值”的场景,避免误推送。

内容的提问来源于stack exchange,提问作者Manish Basantani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:07:12