Silverlight挂在Prism的EventAggregator订阅方法

问题描述:

我在Silverlight中使用Prism的事件聚合器,并且在订阅时遇到困难。当代码击中Subscribe方法时,它就会挂起并且永远不会进入下一行代码。如果我分解代码,_eventAggregator.GetEvent()似乎返回一个有效的事件实例。代码绝对挂在“订阅”上。我在这里做错了什么? JobCompletedEvent在另一个库(这是该库的依赖项)中声明。Silverlight挂在Prism的EventAggregator订阅方法

public void CallMeWhenTheJobIsDone(Action callback) 
    { 
     if (_jobIsRunning) 
      _eventAggregator.GetEvent<JobCompletedEvent>().Subscribe((e) => callback(), ThreadOption.UIThread); 
     else 
      callback(); 
    } 

    public class JobCompletedEvent: Microsoft.Practices.Prism.Events.CompositePresentationEvent<JobCompleted> 
{ } 
public class JobCompleted 
{ 
} 
+0

您能否请张贴用于发布事件的代码和您正在使用的回调方法的示例 – 2012-04-16 12:31:11

1)为什么你使用if (_jobIsRunning)?您在任何的情况下致电callback

2)棱镜只会给你带来的事件 - 并根据你的问题 - 棱镜IS上升和传递事件给你 - 所以它不是一个棱镜的问题 - 似乎,无论通过callback称为是行不通的。

所以我们需要看到更多关于什么是所谓的callback和另一件事:在棱镜情况下,你调用callbackThreadOption.UIThread线程池等等 - 仔细检查是否有其他线程已经锁定UI线程,当你调用callback

+0

我发布的代码不必要的复杂,有_jobIsRunning检查的原因,但我应该提供一个更多的示例到了这一点。回调也是不相关的(代码永远不会那么远,我可以用()=> {}替换它,并且我得到相同的问题)。我认为我的EventAggregator有问题。我将尝试使用Prism源码进行调试,以查看是否有任何线索。 – nicoleeschmidt 2012-04-15 20:21:59

+0

我回过头来,把()=> {}修复了这个问题 – nicoleeschmidt 2012-04-15 22:27:10

我的问题是我不应该在我的订阅中使用匿名方法。棱镜似乎不支持它。有些人称这是一个Prism中的错误,我同意:)你不仅可以不使用匿名方法,但方法必须是公开的。

一些参考文献,我发现谷歌搜索

http://greenicicleblog.com/2010/04/28/prism-event-aggregator-more-leaky-than-it-seems/

Execute same Prism Command from different ViewModels

我怀疑这是在棱镜文档的某个地方,我想我只是吹通过它。如果我设置keepSubscriberReferenceAlice,它可以与私有方法或匿名方法一起工作(现在我已经考虑到了这一点)。有趣的是,在我的沙箱项目中,我甚至无法编译使用私有作用域代码的匿名方法。我的活动项目允许它编译但在运行时失败。

编辑: 是的,它是在文档 http://msdn.microsoft.com/en-us/library/ff921122%28v=pandp.40%29.aspx 大黄色框的方式下跌的一页2/3。