2014-10-07 113 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

相关问题