假設我有一個服務:拍攝快照的的IObservable <T>
public interface ICustomersService
{
IObservable<ICustomer> Customers
{
get;
}
}
的Customers
財產開始通過搶佔了所有現有客戶,並把它們傳遞到觀察員,執行後,它只能通過對客戶說稍後會添加到系統中。因此,它永遠不會完成。
現在假設我想抓住當前客戶的快照(作爲List<ICustomer>
),忽略將來可能添加的任何內容。我怎麼做?任何ToList()
或其親屬的調用將永遠阻止,因爲序列永遠不會完成。
我想我可以寫我自己的擴展,所以我想這:
public static class RxExtensions
{
public static List<T> ToSnapshot<T>(this IObservable<T> @this)
{
var list = new List<T>();
using (@this.Subscribe(x => list.Add(x)));
return list;
}
}
這似乎工作。例如:
var customers = new ReplaySubject<string>();
// snapshot has nothing in it
var snapshot1 = customers.ToSnapshot();
customers.OnNext("A");
customers.OnNext("B");
// snapshot has just the two customers in it
var snapshot2 = customers.ToSnapshot();
customers.OnNext("C");
// snapshot has three customers in it
var snapshot3 = customers.ToSnapshot();
我意識到目前的實現依賴於調度是當前線程,否則在收到項目之前ToSnapshot
可能會關閉其訂閱。不過,我懷疑我也可以包含一個ToSnapshot
覆蓋,它需要IScheduler
並確保在結束快照之前接收到計劃在那裏的任何項目。
我無法在Rx中找到這種快照功能。我錯過了什麼嗎?
假設「快照」僅僅是枚舉當前成員所產生的枚舉......然後我無法想象快照例程會做什麼ToList()不會做。你能詳細說明一下嗎? –
他的'Snapshot'擴展程序立即處理訂閱,僅收到'Subscribe'方法返回之前產生的通知。 –
這實際上比這更多。對'IObservable'使用'ToList()'將直到'IObservable '完成纔會完全沒有任何問題。由於我的'IObservable'永遠不會完成,因此只需調用'ToList()'就會無限期地阻塞。 –