gpt4 book ai didi

.net - Prism CompositeEvent 未使用辅助类指定的匿名过滤器委托(delegate)触发

转载 作者:行者123 更新时间:2023-12-02 00:35:23 24 4
gpt4 key购买 nike

我有一个如下所述的 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 类保留的对委托(delegate)的弱引用相关,因为如果我在订阅调用中设置 keepSubscriberAlive=true(第三个参数),第一个有效。我不能只使用那个解决方案,因为我不知道它能维持生命的是什么?会是订阅该事件的类(class)吗?如果是这样,那么即使没有传递 false,该类仍然存在,那么为什么在第一种情况下没有触发/处理事件?

谁能解释这种行为?

最佳答案

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

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

关于.net - Prism CompositeEvent 未使用辅助类指定的匿名过滤器委托(delegate)触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4843615/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com