我有一个由Using
帮助者制作的可观察者:
var o = Observable.Using(
() => {
return new MyResource
},
res => {
return new Observable.Create<string>(observer => ....);
});
如何取消观察?并确保MyResource
被处理掉?
我看到有一个Observable.Using( )
包含cancellationToken
,但签名是如此不同,我无法让它工作......
更新 正如詹姆斯指出的那样,通过处置可观察量,我的资源也将被处理掉。在我的情况下,一个简单的处置是不够的。我需要先在资源上调用一个方法。怎么归档?
答案 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
中接受,并在处置时调用。