繁体   English   中英

Observable.Using()取消

[英]Observable.Using( ) cancellation

我有一个Using帮助器制作的可观察量:

var o = Observable.Using(
 () => { 
          return new MyResource 
       },
 res => {
          return new Observable.Create<string>(observer => ....);
        });

如何取消观察? 并确保MyResource被处理掉?

我看到有一个Observable.Using( )包含了cancellationToken ,但签名是如此不同,以至于我无法让它工作......

更新:詹姆斯指出,通过处置可观察量,我的资源也将被处理掉。 在我的情况下,一个简单的处置是不够的。 我需要先在资源上调用一个方法。 怎么归档?

您不需要清理可观察的 - 只是订阅。 当您订阅取消Subscribe时,只需在Subscribe返回的句柄上调用Dispose

由作为Using的第一个参数提供的工厂委托创建的资源具有由Using创建的可观察对的订阅的生存期控制的生存期。

这是一个例子:

var xs = Observable.Using(
    () => {                        
        var resource =  Disposable.Create(() => Console.WriteLine("Binned"));
        Console.WriteLine("Created");
        return resource;
    },
    res => Observable.Never<Unit>());

Console.WriteLine("Subscribing");
var sub1 = xs.Subscribe();
var sub2 = xs.Subscribe();
Console.WriteLine("Disposing");            
sub1.Dispose();

给出输出:

Subscribing
Created
Created
Disposing
Binned

由于sub2从未完成并且未被处理,因此仅显示单个Binned消息。

在此示例中, sub1立即完成,并且没有取消:

var xs = Observable.Using(
    () => {                        
        var resource =  Disposable.Create(() => Console.WriteLine("Binned"));
        Console.WriteLine("Created");
        return resource;
    },
    res => Observable.Return(1));

Console.WriteLine("Subscribing");
var sub1 = xs.Subscribe();

这次资源仍然被清理,因为订阅正常终止:

Subscribing
Created
Binned

Using运动取消令牌的重载的目的是允许您取消资源和从属观察的异步创建。 取消令牌在处理订阅句柄时发出信号 - 当然,如果您有相对较长的创建时间并且可能需要尽早处理,这种情况才会真正有用。

附录

要解决您的问题的必然结果:

...一个简单的处置是不够的。 我需要先在资源上调用一个方法。 怎么能[实现]?

从资源工厂方法(使用的第一个参数),执行以下操作:

var xs = Observable.Using(
    () =>
    {                        
        var processHandle = /* code to create process */
        return Disposable.Create(() => /* code to kill process using processHandle */;
    },
    // Rest of code...

Disposable.Create是一个可以使用的辅助方法,它接受在处理时调用的Action

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM