Observable.Using( ) 取消
Observable.Using( ) cancellation
我有一个由 Using
助手创建的可观察对象:
var o = Observable.Using(
() => {
return new MyResource
},
res => {
return new Observable.Create<string>(observer => ....);
});
如何取消可观察对象?并确保 MyResource
被处理掉?
我看到有一个 Observable.Using( )
包含一个 cancellationToken
,但是签名太不一样了,我无法让它工作...
更新:
正如 James 指出的那样,通过处理可观察对象,我的资源也将被处理。就我而言,简单的处置是不够的。我需要先在资源上调用一个方法。如何存档?
您不需要清理 observable - 只需清理订阅。订阅时只需在从 Subscribe
返回的句柄上调用 Dispose
即可取消订阅。
作为 Using
的第一个参数提供的 factory 委托创建的资源的生命周期由 [=17= 创建的可观察对象的订阅生命周期决定].
这是一个例子:
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
体育取消令牌的目的是允许您取消异步创建资源和依赖的可观察对象。取消令牌在处理订阅句柄时发出信号 - 当然,如果您的创建时间相对较长并且很可能提前处理,这种情况只会真正有用。
附录
解决您问题的推论:
...a plain disposal is not enough. I need to call a method on the resource first. How can that be [achieved]?
从您的资源工厂方法(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
中接受,在处理时调用。
我有一个由 Using
助手创建的可观察对象:
var o = Observable.Using(
() => {
return new MyResource
},
res => {
return new Observable.Create<string>(observer => ....);
});
如何取消可观察对象?并确保 MyResource
被处理掉?
我看到有一个 Observable.Using( )
包含一个 cancellationToken
,但是签名太不一样了,我无法让它工作...
更新: 正如 James 指出的那样,通过处理可观察对象,我的资源也将被处理。就我而言,简单的处置是不够的。我需要先在资源上调用一个方法。如何存档?
您不需要清理 observable - 只需清理订阅。订阅时只需在从 Subscribe
返回的句柄上调用 Dispose
即可取消订阅。
作为 Using
的第一个参数提供的 factory 委托创建的资源的生命周期由 [=17= 创建的可观察对象的订阅生命周期决定].
这是一个例子:
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
体育取消令牌的目的是允许您取消异步创建资源和依赖的可观察对象。取消令牌在处理订阅句柄时发出信号 - 当然,如果您的创建时间相对较长并且很可能提前处理,这种情况只会真正有用。
附录
解决您问题的推论:
...a plain disposal is not enough. I need to call a method on the resource first. How can that be [achieved]?
从您的资源工厂方法(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
中接受,在处理时调用。