C# Publish().RefCount()不工作?

C# Publish().RefCount()不工作?,c#,system.reactive,C#,System.reactive,我有一个稍微“昂贵”的计算通过一个可观察的财产暴露出来 如果有多个订阅服务器,我想保护它不被多次运行,所以我在它后面放了一个Publish().RefCount(),但是当我插入断点时,我仍然看到它被调用了两次 public IObservable<int> Property { get { return _Source.Select(Expensive).Publish().RefCount(); } } 公共IObservable属性 { 获取{return}Sourc

我有一个稍微“昂贵”的计算通过一个可观察的财产暴露出来

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

public IObservable<int> Property
{
    get { return _Source.Select(Expensive).Publish().RefCount(); }
}
公共IObservable属性
{
获取{return}Source.Select(昂贵的).Publish().RefCount();}
}
这只是“受保护”的
Publish().RefCount()
的结果,而不是您的源代码-就目前而言,如果您对您的属性有多个调用,您将获得多个独立的“受保护”观测值-每个观测值将独立订阅您的源代码

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

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

//elsewhere:
_Property = _Source.Select(Expensive).Publish().RefCount()
私有IObservable\u财产;
公共IObservable{get{return\u Property;}}
//其他地方:
_属性=\u Source.Select(昂贵).Publish().RefCount()
(或另选)

public IObservable{get;private set;}
//其他地方:
_属性=\u Source.Select(昂贵).Publish().RefCount()

您所说的“保护它不被多次运行”是什么意思?(1) 它只能执行一次,任何进一步执行它的指令都必须忽略;或者(2)一次只能处理一个请求,其他请求(如果有)应该(a)忽略,或者(b)排队?@bradgonesurfing。谢谢你的编辑。有时觉得那个家伙在跟踪我:)这是很容易犯的错误。我必须对我最新的接收代码做一个快速代码检查。我当然希望有一套使用反应式扩展的良好实践和模式。
public IObservable<int> { get; private set; }

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