gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 01:58:48 26 4
gpt4 key购买 nike

我一直无法找到关于如何退订 Observable 的明确答案。 ,已通过 Observable.subscribe(...) 订阅.这里有另一个 SO 答案( Event and Observable in FSharp ),它非常接近,但没有明确说明如何实现,除非我遗漏了一些东西。

调用 Observable.subscribe( someSubscriptionFunction )返回 IDisposable .我只需要.Dispose()删除 someSubscriptionFunction (而且只有它),或者这对 Observable 有影响吗?以及任何其他订阅此Observable ?

最佳答案

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

为了掌握可观察对象的行为方式,最清楚的是查看底层库的 F# 接口(interface)。

意向IDisposableObservable.subscribe 返回是它取消订阅单个IObserver来自 IObservable .

The provider must implement a single method, Subscribe, that indicates that an observer wants to receive push-based notifications. Callers to the method pass an instance of the observer. The method returns an IDisposable implementation that enables observers to cancel notifications at any time before the provider has stopped sending them.



( 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);
}
}

当然,因为这些是接口(interface),所以就实际行为而言,您完全受实现者的摆布。

因此,就实际删除订阅而言,是的,您需要做的就是 Dispose() IDisposable不,它不应该对任何其他观察者产生影响。

您也可以使用 useusing关键字而不是显式调用 dispose。见 this page更多。

关于F#:取消订阅 FSharp.Control.Reactive.Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38351378/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com