F#:取消订阅FSharp.Control.Reactive.Observable

时间:2016-07-13 12:10:09

标签: f# system.reactive observable

我无法找到一个明确的答案,说明如何取消订阅Observable订阅Observable.subscribe(...)。这里有另一个SO答案(Event and Observable in FSharp),它非常接近,但没有明确说明如何实现,除非我遗漏了什么。

Observable.subscribe( someSubscriptionFunction )的调用会返回IDisposable。我是否只需要.Dispose()删除someSubscriptionFunction(并且只有它),或者这对Observable以及此{{1}的任何其他订阅都有效}}?

1 个答案:

答案 0 :(得分:3)

首先,如果您想在观察者通常停止发送通知之前停止接收通知,您只需要取消订阅(例如在触发OnCompletedOnError之前)。

为了了解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而不是,它不会对任何其他观察者产生影响。

您还可以使用useusing关键字,而不是显式调用dispose。有关详情,请参阅this page