3

我有一个 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));

它“确实”着火了。尽管在概念上,在句法和逻辑上都是相似的。唯一的区别是第一个使用事件类中的辅助方法来订阅事件。

我确信这与 CompositeEvent 类保留的对委托的弱引用有关,因为如果我在订阅调用中设置 keepSubscriberAlive=true (第三个参数),第一个有效。我不能只采用那个解决方案,因为我不知道它会保持什么?会是订阅该事件的类吗?如果是这样,那么即使没有传递 false,该类仍然存在,那么为什么在第一种情况下没有触发/处理该事件?

谁能解释这种行为?

4

1 回答 1

3

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

In the second example there is no data to capture, so the delegate which is passed to the Subscribe can be made static. In this case it will live before domain unloading.

于 2011-01-30T19:07:53.700 回答