Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net Prism CompositeEvent未使用助手类指定的匿名筛选器委托激发_.net_Wpf_Prism_Prism 4 - Fatal编程技术网

.net Prism CompositeEvent未使用助手类指定的匿名筛选器委托激发

.net Prism CompositeEvent未使用助手类指定的匿名筛选器委托激发,.net,wpf,prism,prism-4,.net,Wpf,Prism,Prism 4,我有一个TestEvent类,如下所述: class TestEvent: CompositePresentationEvent<object> { public void Subscribe(Action<object> action, int number) { this.Subscribe(action, ThreadOption.PublisherThread, false, arg=>arg.

我有一个TestEvent类,如下所述:

class TestEvent: CompositePresentationEvent<object>
    {
        public void Subscribe(Action<object> action, int number)
        {
            this.Subscribe(action, ThreadOption.PublisherThread, false, arg=>arg.Equals(number));
        }
    }
class TestEvent:CompositePresentationEvent
{
公共无效订阅(操作操作,整数)
{
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));
eventAggregator.GetEvent().Subscribe(=>MessageBox.Show(“Hi”),3);
事件未被激发。但是,如果我这样订阅:

eventAggregator.GetEvent<TestEvent>().Subscribe(_=>MessageBox.Show("Hi"), 3);
eventAggregator.GetEvent<TestEvent>().Subscribe(_ => MessageBox.Show("Hi"), ThreadOption.PublisherThread, false, arg => arg.Equals(3));
eventAggregator.GetEvent().Subscribe(=>MessageBox.Show(“Hi”),ThreadOption.PublisherThread,false,arg=>arg.Equals(3));
它“确实”着火了。虽然在概念上,语法上和逻辑上都是相似的。唯一的区别是第一个使用事件类中的helper方法订阅事件

我确信这与CompositeeEvent类保留的对委托的弱引用有关,因为如果我在subscribe调用中设置keepSubscriberAlive=true(第三个参数),第一个引用就有效。我不能就这么做,因为我不知道它能维持什么?订阅活动的是班级吗?如果是这样,那么即使没有传递false,类仍然是活动的,那么为什么在第一种情况下没有触发/处理事件


有人能解释这种行为吗?

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

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