Observable.Using()取消

时间:2015-02-02 23:49:00

标签: c# .net system.reactive

我有一个由Using帮助者制作的可观察者:

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

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

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

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

1 个答案:

答案 0 :(得分:8)

您无需清理可观察对象 - 只需订阅即可。当您订阅取消它时,只需在Dispose返回的句柄上调用Subscribe

作为Using的第一个参数提供的 factory 委托创建的资源的生命周期由Using创建的observable的预订生命周期决定。

以下是一个例子:

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中接受,并在处置时调用。