gpt4 book ai didi

c# - Observable.Using( ) 取消

转载 作者:行者123 更新时间:2023-11-30 19:39:17 25 4
gpt4 key购买 nike

我有一个由 Using 助手创建的可观察对象:

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

如何取消可观察对象?并以此确保 MyResource 被处理掉?

我看到有一个包含 cancellationTokenObservable.Using( ),但是签名太不一样了,我无法让它工作。 .

更新:正如 James 指出的那样,通过处理可观察对象,我的资源也将被处理。就我而言,简单的处置是不够的。我需要先在资源上调用一个方法。如何存档?

最佳答案

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

工厂 委托(delegate)创建的资源作为 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的目的运动取消 token 允许您取消资源和依赖可观察对象的异步创建。取消 token 在处理订阅句柄时发出信号 - 当然,只有当您的创建时间相对较长并且很可能提前处理时,这种情况才会真正有用。

附录

解决您问题的推论:

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

关于c# - Observable.Using( ) 取消,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28288975/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com