2011-01-30 61 views
3

我有一个TestEvent类匿名过滤委托解雇没有被解雇。但是,如果我这样认购它:棱镜CompositeEvent不与助手类指定

eventAggregator.GetEvent<TestEvent>().Subscribe(_ => MessageBox.Show("Hi"), ThreadOption.PublisherThread, false, arg => arg.Equals(3)); 

它'火'。尽管在概念上,从句法和逻辑上都是相似的。唯一的区别是第一个使用事件类中的助手方法来订阅事件。

我敢肯定,这是关于由CompositeEvent类保留的委托的弱引用相关的事情,因为如果我在订阅调用中设置keepSubscriberAlive = true(第三个参数),第一个工作。我不能只用这个解决方案,因为我不知道它会保持活力的是什么?这会是订阅该活动的班级吗?如果是这样的话,那么即使没有传递错误,这个班还活着,那么为什么这个事件在第一种情况下不会被解雇/处理?

任何人都可以解释这种行为吗?

回答

3

在第一个示例中,代码捕获传递给TestEvent方法的变量。在这种情况下,编译器需要创建一个包装数字的类。每次调用TestEvent的Subscribe时,都应该实例化这个类的新实例。

在第二个示例中没有要捕获的数据,因此可以将传递给Subscribe的委托设为静态。在这种情况下,它将在域卸载之前生存。