如何设置Observable的处理动作?

时间:2014-01-22 14:04:52

标签: c# system.reactive observable

我知道如何创建一个observable并分配一个处置动作:

Observable.Create(o =>
{
    // o.OnNext etc.
    return Disposable.Create(() => { /* ... */ });
});

但是现在我从查询语法中产生了一个observable:

var observable = from x in otherObservable
                 select x;

如何为此类查询分配处置操作?

3 个答案:

答案 0 :(得分:6)

如果我理解正确,那么无论何时处理订阅,您都希望“链接”或“收听”。一种方法是使用Finally的{​​{1}}运算符,如下所示:

IObservable<T>

希望有所帮助!

答案 1 :(得分:2)

我认为你应该澄清你的问题。 “处理行动”的含义并不完全清楚。

建议使用Observable.Finally调用操作,但是当满足以下第一个条件时,此操作将会运行:

  • Observable发送OnCompleted()
  • Observable发送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();