Veg*_*gar 2 .net c# system.reactive
我有一个由Using帮助者制作的观察结果:
var o = Observable.Using(
() => {
return new MyResource
},
res => {
return new Observable.Create<string>(observer => ....);
});
Run Code Online (Sandbox Code Playgroud)
如何取消观察?并确保MyResource被处理掉?
我看到有一个Observable.Using( )包括a cancellationToken,但签名是如此不同,我无法使其工作......
更新: 詹姆斯指出,通过处置可观察量,我的资源也将被处理掉.在我的情况下,一个简单的处置是不够的.我需要先在资源上调用一个方法.怎么归档?
您不需要清理可观察的 - 只是订阅.只需调用订阅时Dispose返回的句柄Subscribe即可取消.
由作为第一个参数提供的工厂委托创建的资源Using具有由生成的observable的预期生命周期所支配的生命周期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();
Run Code Online (Sandbox Code Playgroud)
给出输出:
Subscribing
Created
Created
Disposing
Binned
Run Code Online (Sandbox Code Playgroud)
由于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();
Run Code Online (Sandbox Code Playgroud)
这次资源仍然被清理,因为订阅正常终止:
Subscribing
Created
Binned
Run Code Online (Sandbox Code Playgroud)
Using运动取消令牌重载的目的是允许您取消资源和从属观察的异步创建.取消令牌在处理订阅句柄时发出信号 - 当然,如果您有相对较长的创建时间并且可能需要尽早处理,这种情况才会真正有用.
要解决您的问题的必然结果:
...一个简单的处置是不够的.我需要先在资源上调用一个方法.怎么能[实现]?
从资源工厂方法(使用的第一个参数),执行以下操作:
var xs = Observable.Using(
() =>
{
var processHandle = /* code to create process */
return Disposable.Create(() => /* code to kill process using processHandle */;
},
// Rest of code...
Run Code Online (Sandbox Code Playgroud)
Disposable.Create是一种你可以使用的辅助方法,它可以Action在处理时调用.
| 归档时间: |
|
| 查看次数: |
876 次 |
| 最近记录: |