簡體   English   中英

Observable.Using()取消

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM