我有一个如下所述的TestEvent类:
class TestEvent: CompositePresentationEvent<object>
{
public void Subscribe(Action<object> action, int number)
{
this.Subscribe(action, ThreadOption.PublisherThread, false, arg=>arg.Equals(number));
}
}
如果我订阅了这样的活动:
eventAggregator.GetEvent<TestEvent>().Subscribe(_=>MessageBox.Show("Hi"), 3);
事件未被触发。但是,如果我订阅它是这样的:
eventAggregator.GetEvent<TestEvent>().Subscribe(_ => MessageBox.Show("Hi"), ThreadOption.PublisherThread, false, arg => arg.Equals(3));
它'确实'开火了。虽然从概念上讲,语法上和逻辑上都是相似的。唯一的区别是第一个使用事件类中的helper方法来订阅事件。
我确定这是与CompositeEvent类保存的委托的弱引用相关的东西,因为如果我在subscribe调用中设置keepSubscriberAlive = true(第三个参数),第一个就可以工作。我不能只是采用那种解决方案,因为我不知道它会继续存在的是什么?是订阅活动的班级吗?如果是这样,那么即使没有传递假,该类仍然存在,那么为什么在第一种情况下不会触发/处理该事件?
任何人都可以解释这种行为吗?
答案 0 :(得分:3)
在第一个示例中,代码捕获一个变量,传递给TestEvent的方法。在这种情况下,编译器需要创建一个包装数字的类。每次调用TestEvent的Subscribe时,都应该实例化此类的新实例。
在第二个示例中,没有要捕获的数据,因此传递给Subscribe的委托可以变为静态。在这种情况下,它将在域名卸载之前生效。