我會創建一個observable(通過各種方法)並將其返回給感興趣的各方,但是當他們完成了偵聽時,我想拆除可觀察對象,以免它繼續佔用資源。另一種方式是將其視爲在酒吧子系統中創建主題。當沒有人再訂閱某個主題時,您不想再圍繞主題及其過濾。如何創建一個Rx observable,當最後一個觀察者取消訂閱時停止發佈事件?
6
A
回答
10
的Rx已經有運營商,以滿足您的需求 - 以及兩人竟 - Publish
& RefCount
。
下面是如何使用它們:
IObservable xs = ...
var rxs = xs.Publish().RefCount();
var sub1 = rxs.Subscribe(x => { });
var sub2 = rxs.Subscribe(x => { });
//later
sub1.Dispose();
//later
sub2.Dispose();
//The underlying subscription to `xs` is now disposed of.
簡單。
1
如果我已經理解了你的問題,你想創建observable,這樣當所有的訂閱者都處理了它們的訂閱,即沒有更多的訂閱者,那麼你想執行一個清理功能,這將停止生產中的observable其他值。 如果這是你想要的,那麼你可以這樣做如下:
//Wrap a disposable
public class WrapDisposable : IDisposable
{
IDisposable disp;
Action act;
public WrapDisposable(IDisposable _disp, Action _act)
{
disp = _disp;
act = _act;
}
void IDisposable.Dispose()
{
act();
disp.Dispose();
}
}
//Observable that we want to clean up after all subs are done
public static IObservable<long> GenerateObs(out Action cleanup)
{
cleanup =() =>
{
Console.WriteLine("All subscribers are done. Do clean up");
};
return Observable.Interval(TimeSpan.FromSeconds(1));
}
//Wrap the observable
public static IObservable<T> WrapToClean<T>(IObservable<T> obs, Action onAllDone)
{
int count = 0;
return Observable.CreateWithDisposable<T>(ob =>
{
var disp = obs.Subscribe(ob);
Interlocked.Increment(ref count);
return new WrapDisposable(disp,() =>
{
if (Interlocked.Decrement(ref count) == 0)
{
onAllDone();
}
});
});
}
//用例:
Action cleanup;
var obs = GenerateObs(out cleanup);
var newObs = WrapToClean(obs, cleanup);
newObs.Take(6).Subscribe(Console.WriteLine);
newObs.Take(5).Subscribe(Console.WriteLine);
相關問題
- 1. 如何防止在最後一位觀察者取消訂閱時完成AsyncSubject
- 2. Rx中的一個觀察者的多個訂閱
- 3. rxJava停止觀察取消訂閱
- 4. 如何取消訂閱/停止Observable?
- 5. RxJava等待一個觀察者與訂閱者等待另一個觀察者與其他訂閱者
- 6. 如何防止使用事件觀察者取消訂單?
- 7. 商店取消訂閱與觀察者
- 8. 訂閱多個observable的觀察者未完成
- 9. 取消可觀察訂閱並等待觀察者完成
- 10. C#事件多個發佈者到一個訂閱者
- 11. 創建一個Observable,您可以在RxCpp中取消訂閱
- 12. RxJava2:第一次訂閱和最後一次取消訂閱觀察者的PublishProcessor回調
- 13. Rx在Observable創建之前訂閱
- 14. 如何從多個DBContexts創建一個熱的RX觀察值
- 15. 如何使'Defer`ed observable只訂閱第一個訂閱者?
- 16. 取消訂閱動態觀察對象
- 17. 當它發出一定的值時取消訂閱observable
- 18. 如何取消訂閱服務器端的觀察者
- 19. 的Rx JS訂閱觀察到多個觀測量
- 20. 角度:取消訂閱Timer後注入另一個功能Observable
- 21. 如何取消訂閱AngularFire數據庫觀察/訂閱?
- 22. JMS訂閱者在一段時間後停止從主題獲取消息
- 23. RxJS Observable:在處理最後一個訂閱時執行清理?
- 24. C#如何創建一個發佈事件和類訂閱的單身人士?
- 25. rxjs5:延遲取消訂閱共享可觀察者
- 26. RxSwift多訂閱一個observable
- 27. 多次發佈一個通知(一個觀察者)
- 28. 如何創建可觸發的可觀察訂閱,只觸發一次?
- 29. 在同一觀察者上訂閱後,RxJs捕獲無效
- 30. 一個可觀察事件的多個可觀察事件