我知道如何创建一个可观察的可观察措施:
:Observable.Create(o =>
{
// o.OnNext etc.
return Disposable.Create(() => { /* ... */ });
});
,但现在我从查询语法中产生了一个可观察的:
var observable = from x in otherObservable
select x;
如何将处置操作分配给此类查询?
如果我正确理解,则只要处置订阅时就要"链"或"听"。一种方法是使用IObservable<T>
的Finally
操作员,因此:
var ob = from x in Observable.Interval(TimeSpan.FromSeconds(1))
select x;
// Use Finally to create an intermediate IObservable
var disposeSub = ob.Finally(() => Console.WriteLine("disposed"));
// Subscribe to the intermediate observable instead the original one
var yourSub = disposeSub.Subscribe(Console.WriteLine);
// Wait for some numbers to print
Thread.Sleep(TimeSpan.FromSeconds(4));
// "disposed" will be written on the console at this point
yourSub.Dispose();
希望有帮助!
我认为您应该澄清您的问题。目前尚不清楚您通过"处置行动"的含义。
已建议使用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
是否正如卡洛斯(Carlos)所建议的那样适合!
您不处理可观察的。您将可观察的订阅处置。
示例:
var observable = from x in otherObservable
select x;
var sub = observable.Subscribe(DoStuff);
sub.Dispose();