2014-10-07 136 views
0

我從Observable.FromEventPattern得到一個的IObservable,如下圖所示:如何向Observable.FromEventPattern中使用的事件註冊/取消註冊處理程序?

SomeObject target = new SomeObject(); 
string eventName = "SomeEvent"; 
IObservable<T> obs = Observable.FromEventPattern<T>(target, eventName); 

據我瞭解,在FromEventPattern呼叫會自動生成添加/刪除事件處理我。但是什麼時候處理程序實際上被添加/刪除?

我認爲處理程序是在IObservable訂閱時添加的。處理程序是否也會在用戶處置時自動取消註冊?

回答

4

這是很容易只寫了一個簡單的測試,你自己看,只需提供自己的處理程序產生副作用時Observable使用添加/刪除處理程序:

var observable = Observable.FromEvent(
    action => Console.WriteLine("Added"), 
    action => Console.WriteLine("removed")); 

Console.WriteLine("Subscribing"); 
var subscription = observable.Subscribe(unit => { }); 
Console.WriteLine("disposing"); 
subscription.Dispose(); 
Console.WriteLine("done"); 

這會打印出:

Subscribing 
Added 
disposing 
removed 
done

告訴我們,訂閱調用添加處理程序,並處置訂閱對象刪除處理程序。

如果您有多次對observable的訂閱,那麼只要您訂閱了以前沒有訂閱的observable,就會添加處理程序,並且處置訂閱只會刪除最後剩下的處理程序訂戶。這可以通過修改測試來創建多個訂閱,然後將其全部處理掉。

+1

謝謝,我不知道那些其他覆蓋這樣做。那麼這是否意味着如果你不處理訂閱並且它超出範圍,那麼它仍然保持對該事件的強烈參考(並且可能導致泄漏?) – fred 2014-10-07 17:23:58

+2

@fred是的。通常使用[CompositeDisposable](http://msdn.microsoft.com/zh-cn/library/system.reactive.disposables.compositedisposable.aspx)保留一次性使用的集合。 – 2014-10-07 17:27:04

+1

@fred可觀察對象將會引用正在觀察的任何事物,只要事件被附加,觀察對象就持有對可觀察事物的引用,這是一個循環引用。這意味着GC如果另一個根深蒂固,則無法回收一個。現在,如果*兩者*可觀察的*和*被觀察物體的壽命已經結束,那麼*兩個*都可以被回收。如果你堅持引用一個引用,並且希望另一個引用能夠被釋放,那麼只有手上有問題,在這種情況下,你需要「解除」它們。 – Servy 2014-10-07 17:31:18

相關問題