我无法找到一个明确的答案,说明如何取消订阅Observable
订阅Observable.subscribe(...)
。这里有另一个SO答案(Event and Observable in FSharp),它非常接近,但没有明确说明如何实现,除非我遗漏了什么。
对Observable.subscribe( someSubscriptionFunction )
的调用会返回IDisposable
。我是否只需要.Dispose()
删除someSubscriptionFunction
(并且只有它),或者这对Observable
以及此{{1}的任何其他订阅都有效}}?
答案 0 :(得分:3)
首先,如果您想在观察者通常停止发送通知之前停止接收通知,您只需要取消订阅(例如在触发OnCompleted
或OnError
之前)。
为了了解observable的行为方式,最好看看底层库的F#接口。
IDisposable
返回的Observable.subscribe
的意图是取消订阅IObserver
中的IObservable
个。{/ p>
提供者必须实现一个指示的单一方法Subscribe 观察者想要接收基于推送的通知。来电者 该方法传递一个观察者的实例。该方法返回一个 IDisposable实现,使观察者能够取消 在提供商停止发送之前的任何时间发送通知 它们。
(Source)
您可以从此处提供的example实现中看到此行为(在C#中,遗憾的是页面缺少F#示例):
相关摘录如下:
private class Unsubscriber : IDisposable
{
private List<IObserver<Location>>_observers;
private IObserver<Location> _observer;
public Unsubscriber(List<IObserver<Location>> observers, IObserver<Location> observer)
{
this._observers = observers;
this._observer = observer;
}
public void Dispose()
{
if (_observer != null && _observers.Contains(_observer))
_observers.Remove(_observer);
}
}
当然,因为这些是接口,所以在实际行为方面,你完全受制于实施者。
因此,就实际删除订阅而言,是的,您需要做的只是Dispose()
IDisposable
而不是,它不会对任何其他观察者产生影响。
您还可以使用use
或using
关键字,而不是显式调用dispose。有关详情,请参阅this page。