如何将处置动作设置为可观察的



我知道如何创建一个可观察的可观察措施:

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

相关内容

  • 没有找到相关文章