[英]Observable.Using( ) cancellation
我有一個Using
幫助器制作的可觀察量:
var o = Observable.Using(
() => {
return new MyResource
},
res => {
return new Observable.Create<string>(observer => ....);
});
如何取消觀察? 並確保MyResource
被處理掉?
我看到有一個Observable.Using( )
包含了cancellationToken
,但簽名是如此不同,以至於我無法讓它工作......
更新:詹姆斯指出,通過處置可觀察量,我的資源也將被處理掉。 在我的情況下,一個簡單的處置是不夠的。 我需要先在資源上調用一個方法。 怎么歸檔?
您不需要清理可觀察的 - 只是訂閱。 當您訂閱取消Subscribe
時,只需在Subscribe
返回的句柄上調用Dispose
。
由作為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
運動取消令牌的重載的目的是允許您取消資源和從屬觀察的異步創建。 取消令牌在處理訂閱句柄時發出信號 - 當然,如果您有相對較長的創建時間並且可能需要盡早處理,這種情況才會真正有用。
要解決您的問題的必然結果:
...一個簡單的處置是不夠的。 我需要先在資源上調用一個方法。 怎么能[實現]?
從資源工廠方法(使用的第一個參數),執行以下操作:
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
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.