【问题标题】:Publish().RefCount() not working?Publish().RefCount() 不工作?
【发布时间】:2014-04-28 17:28:38
【问题描述】:

我通过 IObservable 属性公开了一个稍微“昂贵”的计算。

如果有多个订阅者,我想保护它不被多次运行,所以我在它后面放了一个 Publish().RefCount(),但是当我插入断点时,我仍然看到它被调用了两次。

public IObservable<int> Property
{
    get { return _Source.Select(Expensive).Publish().RefCount(); }
}

【问题讨论】:

  • “保护它不被多次运行”是什么意思? (1) 它应该只执行一次,并且必须忽略任何进一步的执行指令;或 (2) 一次只应处理一个请求,其他请求(如果有)应 (a) 忽略,或 (b) 排队?

标签: c# system.reactive


【解决方案1】:

只有Publish().RefCount()结果 是“受保护”的,而不是您的来源 - 就目前而言,如果您多次调用您的财产,您将获得多个 独立 'protected' observables - 每个都独立地订阅你的源。

您需要一个支持字段,您可以确保它只定义一次:

private IObservable<int> _Property;
public IObservable<int> { get { return _Property; } }

//elsewhere:
_Property = _Source.Select(Expensive).Publish().RefCount()

(或替代)

public IObservable<int> { get; private set; }

//elsewhere:
_Property = _Source.Select(Expensive).Publish().RefCount()

【讨论】:

  • @bradgonesurfing。感谢您的编辑。有时感觉那家伙在跟踪我:)
  • 这是很容易犯的错误。我必须对我最新的 RX 代码进行快速代码审查。我当然希望有一套使用响应式扩展的良好实践和模式。
猜你喜欢
  • 1970-01-01
  • 2015-08-22
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 2022-07-07
  • 1970-01-01
相关资源
最近更新 更多