你如何注册/取消注册 Observable.FromEventPattern 中使用的事件的处理程序?

fre*_*red 1 .net c# reactive-programming system.reactive

我从 Observable.FromEventPattern 得到一个 IObservable,如下所示:

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

据我了解,FromEventPattern 调用将自动为我生成添加/删除事件处理程序。但是处理程序何时真正被添加/删除?

我假设在订阅 IObservable 时添加了处理程序。处理订阅者时,处理程序是否也会自动取消注册?

Ser*_*rvy 5

自己编写一个简单的测试来查看何时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");
Run Code Online (Sandbox Code Playgroud)

这打印出来:

订阅
添加
处置
移除
完毕

告诉我们订阅会调用添加处理程序,而处理订阅对象会删除处理程序。

如果您对 observable 有多个订阅,那么每当您订阅一个没有先前订阅的 observable 时都会添加处理程序,并且如果订阅是最后一个剩余的订阅者,则处理订阅只会删除处理程序。这可以通过修改测试以创建多个订阅然后将它们全部处理掉来看到。

  • @弗雷德是的。使用 [CompositeDisposable](http://msdn.microsoft.com/en-us/library/system.reactive.disposables.compositedisposable.aspx) 保留一次性物品的集合是很常见的。 (2认同)