我知道如何创建一个observable并分配一个处置动作:
Observable.Create(o =>
{
// o.OnNext etc.
return Disposable.Create(() => { /* ... */ });
});
但是现在我从查询语法中产生了一个observable:
var observable = from x in otherObservable
select x;
如何为此类查询分配处置操作?
答案 0 :(得分:6)
如果我理解正确,那么无论何时处理订阅,您都希望“链接”或“收听”。一种方法是使用Finally
的{{1}}运算符,如下所示:
IObservable<T>
希望有所帮助!
答案 1 :(得分:2)
我认为你应该澄清你的问题。 “处理行动”的含义并不完全清楚。
建议使用Observable.Finally
调用操作,但是当满足以下第一个条件时,此操作将会运行:
OnCompleted()
OnError()
即。您无法保证在订阅句柄上调用Dispose
时将会精确执行操作;它可能已经运行 - 但调用Dispose
可确保在调用Dispose
之前调用它。
这可能就是你所需要的 - 但是按照你的意思,你只希望在最后一种情况下运行 - 在处理句柄时,你需要附加对订阅句柄本身的操作,即:
var otherDisposable = /* your observable */;
Action disposingAction = () => Console.WriteLine("I am disposed!");
var subscription = otherDisposable.Subscribe(/* set your handlers here */);
var disposable = new CompositeDisposable(
subscription,
Disposable.Create(disposingAction));
/* The disposingAction is *only* run when this is called */
disposable.Dispose();
我无法想象会有什么情况需要这个,我想知道卡洛斯建议的Observable.Finally
是否更合适!
答案 2 :(得分:0)
您不会处置可观察物。您处置可观察的订阅。
示例:
var observable = from x in otherObservable
select x;
var sub = observable.Subscribe(DoStuff);
sub.Dispose();