一次性通過Subscribe
擴展方法返回僅恢復到允許您從可觀察可觀察到的自然結束之前手動取消。
如果observable完成 - 無論是OnCompleted
還是OnError
- 那麼訂閱已經爲您處理。如果你運行上面的你會看到
var xs = Observable.Create<int>(o =>
{
var d = Observable.Return(1).Subscribe(o);
return Disposable.Create(() =>
{
Console.WriteLine("Disposed!");
d.Dispose();
});
});
var subscription = xs.Subscribe(x => Console.WriteLine(x));
:
試試這個代碼「出售!」在observable完成時寫入控制檯,而不需要訂閱上的電話.Dispose()
。
一個重要的一點要注意:垃圾收集器可觀察到的訂閱從來不打電話.Dispose()
,所以你訂閱的必須處置,如果他們沒有(或可能沒有)訂閱超出範圍之前自然結束。
拿這個,例如:
var wc = new WebClient();
var ds = Observable
.FromEventPattern<
DownloadStringCompletedEventHandler,
DownloadStringCompletedEventArgs>(
h => wc.DownloadStringCompleted += h,
h => wc.DownloadStringCompleted -= h);
var subscription =
ds.Subscribe(d =>
Console.WriteLine(d.EventArgs.Result));
的ds
觀察到的將只重視事件處理程序時,它有一個訂閱,當觀察到完成或訂閱配置只會脫離。由於它是一個事件處理程序,observable將永遠不會完成,因爲它正在等待更多事件,因此處置是從事件中分離出來的唯一方法(對於上例)。
當你有一個FromEventPattern
觀察到的,你知道會永遠只返回一個值,那麼它是明智訂閱允許事件處理程序自動分離之前添加.Take(1)
擴展方法,然後你不需要手動處置訂閱。
像這樣:
var ds = Observable
.FromEventPattern<
DownloadStringCompletedEventHandler,
DownloadStringCompletedEventArgs>(
h => wc.DownloadStringCompleted += h,
h => wc.DownloadStringCompleted -= h)
.Take(1);
我希望這有助於。
恕我直言,事實上,已釋放的對象是在範圍上使得不良作風。我錯過了什麼嗎? –
通過這個,你的意思是說,如果myObservable在一次性變量超出範圍之前觸發,那麼「一次性」變量可以被丟棄?什麼是更好的模式來處理這個對象? – Noob